blob: 8a5bf559e8cd755eb62a9e83570951726743f19a [file] [log] [blame]
Gareth Hughesfc2427e2000-10-23 00:16:28 +00001/* $Id: context.c,v 1.95 2000/10/23 00:16:28 gareth Exp $ */
jtgafb833d1999-08-19 00:55:39 +00002
3/*
4 * Mesa 3-D graphics library
Brian Paule4b684c2000-09-12 21:07:40 +00005 * Version: 3.5
jtgafb833d1999-08-19 00:55:39 +00006 *
Brian Paul54287052000-01-17 20:00:15 +00007 * Copyright (C) 1999-2000 Brian Paul All Rights Reserved.
jtgafb833d1999-08-19 00:55:39 +00008 *
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 */
26
27
jtgafb833d1999-08-19 00:55:39 +000028#ifdef PC_HEADER
29#include "all.h"
30#else
Brian Paulfbd8f211999-11-11 01:22:25 +000031#include "glheader.h"
Brian Paulb1394fa2000-09-26 20:53:53 +000032#include "buffers.h"
jtgafb833d1999-08-19 00:55:39 +000033#include "clip.h"
Brian Paul4bdcfe52000-04-17 17:57:04 +000034#include "colortab.h"
jtgafb833d1999-08-19 00:55:39 +000035#include "context.h"
36#include "cva.h"
jtgafb833d1999-08-19 00:55:39 +000037#include "dlist.h"
38#include "eval.h"
39#include "enums.h"
Brian Paul585a68c1999-09-11 11:31:34 +000040#include "extensions.h"
jtgafb833d1999-08-19 00:55:39 +000041#include "fog.h"
Brian Paulb7a43041999-11-30 20:34:51 +000042#include "get.h"
Brian Paulf9b97d92000-01-28 20:17:42 +000043#include "glapinoop.h"
Brian Paul9560f052000-01-31 23:11:39 +000044#include "glthread.h"
jtgafb833d1999-08-19 00:55:39 +000045#include "hash.h"
Brian Paulb1394fa2000-09-26 20:53:53 +000046#include "imports.h"
jtgafb833d1999-08-19 00:55:39 +000047#include "light.h"
jtgafb833d1999-08-19 00:55:39 +000048#include "macros.h"
49#include "matrix.h"
Brian Paulfbd8f211999-11-11 01:22:25 +000050#include "mem.h"
jtgafb833d1999-08-19 00:55:39 +000051#include "mmath.h"
52#include "pb.h"
53#include "pipeline.h"
jtgafb833d1999-08-19 00:55:39 +000054#include "shade.h"
55#include "simple_list.h"
jtgafb833d1999-08-19 00:55:39 +000056#include "stages.h"
Brian Paulfa9df402000-02-02 19:16:46 +000057#include "state.h"
jtgafb833d1999-08-19 00:55:39 +000058#include "translate.h"
59#include "teximage.h"
60#include "texobj.h"
jtgafb833d1999-08-19 00:55:39 +000061#include "texture.h"
62#include "types.h"
63#include "varray.h"
64#include "vb.h"
jtgafb833d1999-08-19 00:55:39 +000065#include "vbrender.h"
66#include "vbxform.h"
Keith Whitwell38756791999-08-29 10:26:31 +000067#include "vertices.h"
jtgafb833d1999-08-19 00:55:39 +000068#include "xform.h"
jtgafb833d1999-08-19 00:55:39 +000069#endif
70
Brian Paul3b18a362000-09-26 15:27:20 +000071#if defined(MESA_TRACE)
Brian Paul45f36342000-09-05 20:28:06 +000072#include "Trace/tr_context.h"
73#include "Trace/tr_wrapper.h"
74#endif
75
jtgafb833d1999-08-19 00:55:39 +000076
Brian Paulb1394fa2000-09-26 20:53:53 +000077
78/**********************************************************************/
79/***** OpenGL SI-style interface (new in Mesa 3.5) *****/
80/**********************************************************************/
81
82static GLboolean
83_mesa_DestroyContext(__GLcontext *gc)
84{
85 if (gc) {
86 _mesa_free_context_data(gc);
87 (*gc->imports.free)(gc, gc);
88 }
89 return GL_TRUE;
90}
91
92
93/* exported OpenGL SI interface */
94__GLcontext *
95__glCoreCreateContext(__GLimports *imports, __GLcontextModes *modes)
96{
97 GLcontext *ctx;
98
99 ctx = (GLcontext *) (*imports->calloc)(0, 1, sizeof(GLcontext));
100 if (ctx == NULL) {
101 return NULL;
102 }
103 ctx->imports = *imports;
104
105 _mesa_initialize_visual(&ctx->Visual,
106 modes->rgbMode,
107 modes->doubleBufferMode,
108 modes->stereoMode,
109 modes->redBits,
110 modes->greenBits,
111 modes->blueBits,
112 modes->alphaBits,
113 modes->indexBits,
114 modes->depthBits,
115 modes->stencilBits,
116 modes->accumRedBits,
117 modes->accumGreenBits,
118 modes->accumBlueBits,
119 modes->accumAlphaBits,
120 0);
121
122 _mesa_initialize_context(ctx, &ctx->Visual, NULL, imports->wscx, GL_FALSE);
123
124 ctx->exports.destroyContext = _mesa_DestroyContext;
125
126 return ctx;
127}
128
129
130/* exported OpenGL SI interface */
131void
132__glCoreNopDispatch(void)
133{
134#if 0
135 /* SI */
136 __gl_dispatch = __glNopDispatchState;
137#else
138 /* Mesa */
139 _glapi_set_dispatch(NULL);
140#endif
141}
142
143
jtgafb833d1999-08-19 00:55:39 +0000144/**********************************************************************/
145/***** Context and Thread management *****/
146/**********************************************************************/
147
148
Brian Paul00037781999-12-17 14:52:35 +0000149#if !defined(THREADS)
jtgafb833d1999-08-19 00:55:39 +0000150
Brian Paul5666c632000-01-18 17:36:16 +0000151struct immediate *_mesa_CurrentInput = NULL;
jtgafb833d1999-08-19 00:55:39 +0000152
Brian Paul00037781999-12-17 14:52:35 +0000153#endif
jtgafb833d1999-08-19 00:55:39 +0000154
155
jtgafb833d1999-08-19 00:55:39 +0000156/**********************************************************************/
Brian Paul4d053dd2000-01-14 04:45:47 +0000157/***** GL Visual allocation/destruction *****/
158/**********************************************************************/
159
160
161/*
162 * Allocate a new GLvisual object.
163 * Input: rgbFlag - GL_TRUE=RGB(A) mode, GL_FALSE=Color Index mode
Brian Paul4d053dd2000-01-14 04:45:47 +0000164 * dbFlag - double buffering?
165 * stereoFlag - stereo buffer?
Brian Pauled30dfa2000-03-03 17:47:39 +0000166 * depthBits - requested bits per depth buffer value
167 * Any value in [0, 32] is acceptable but the actual
168 * depth type will be GLushort or GLuint as needed.
169 * stencilBits - requested minimum bits per stencil buffer value
170 * accumBits - requested minimum bits per accum buffer component
171 * indexBits - number of bits per pixel if rgbFlag==GL_FALSE
172 * red/green/blue/alphaBits - number of bits per color component
173 * in frame buffer for RGB(A) mode.
174 * We always use 8 in core Mesa though.
Brian Paul4d053dd2000-01-14 04:45:47 +0000175 * Return: pointer to new GLvisual or NULL if requested parameters can't
176 * be met.
177 */
Brian Paulb371e0d2000-03-31 01:05:51 +0000178GLvisual *
179_mesa_create_visual( GLboolean rgbFlag,
Brian Paulb371e0d2000-03-31 01:05:51 +0000180 GLboolean dbFlag,
181 GLboolean stereoFlag,
182 GLint redBits,
183 GLint greenBits,
184 GLint blueBits,
185 GLint alphaBits,
186 GLint indexBits,
187 GLint depthBits,
188 GLint stencilBits,
189 GLint accumRedBits,
190 GLint accumGreenBits,
191 GLint accumBlueBits,
192 GLint accumAlphaBits,
193 GLint numSamples )
Brian Paul4d053dd2000-01-14 04:45:47 +0000194{
Brian Paul178a1c52000-04-22 01:05:00 +0000195 GLvisual *vis = (GLvisual *) CALLOC( sizeof(GLvisual) );
196 if (vis) {
Brian Paule70c6232000-05-04 13:53:55 +0000197 if (!_mesa_initialize_visual(vis, rgbFlag, dbFlag, stereoFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000198 redBits, greenBits, blueBits, alphaBits,
199 indexBits, depthBits, stencilBits,
200 accumRedBits, accumGreenBits,
201 accumBlueBits, accumAlphaBits,
Brian Paulb1394fa2000-09-26 20:53:53 +0000202 numSamples)) {
Brian Paul178a1c52000-04-22 01:05:00 +0000203 FREE(vis);
204 return NULL;
205 }
206 }
207 return vis;
208}
209
210
211/*
212 * Initialize the fields of the given GLvisual.
213 * Input: see _mesa_create_visual() above.
214 * Return: GL_TRUE = success
215 * GL_FALSE = failure.
216 */
217GLboolean
218_mesa_initialize_visual( GLvisual *vis,
219 GLboolean rgbFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000220 GLboolean dbFlag,
221 GLboolean stereoFlag,
222 GLint redBits,
223 GLint greenBits,
224 GLint blueBits,
225 GLint alphaBits,
226 GLint indexBits,
227 GLint depthBits,
228 GLint stencilBits,
229 GLint accumRedBits,
230 GLint accumGreenBits,
231 GLint accumBlueBits,
232 GLint accumAlphaBits,
233 GLint numSamples )
234{
235 assert(vis);
Brian Paul4d053dd2000-01-14 04:45:47 +0000236
Brian Pauled30dfa2000-03-03 17:47:39 +0000237 /* This is to catch bad values from device drivers not updated for
238 * Mesa 3.3. Some device drivers just passed 1. That's a REALLY
239 * bad value now (a 1-bit depth buffer!?!).
240 */
241 assert(depthBits == 0 || depthBits > 1);
242
243 if (depthBits < 0 || depthBits > 32) {
Brian Paul178a1c52000-04-22 01:05:00 +0000244 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000245 }
Brian Pauled30dfa2000-03-03 17:47:39 +0000246 if (stencilBits < 0 || stencilBits > (GLint) (8 * sizeof(GLstencil))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000247 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000248 }
Brian Paulb371e0d2000-03-31 01:05:51 +0000249 if (accumRedBits < 0 || accumRedBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000250 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000251 }
252 if (accumGreenBits < 0 || accumGreenBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000253 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000254 }
255 if (accumBlueBits < 0 || accumBlueBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000256 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000257 }
258 if (accumAlphaBits < 0 || accumAlphaBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000259 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000260 }
261
262 vis->RGBAflag = rgbFlag;
263 vis->DBflag = dbFlag;
264 vis->StereoFlag = stereoFlag;
265 vis->RedBits = redBits;
266 vis->GreenBits = greenBits;
267 vis->BlueBits = blueBits;
Brian Paule70c6232000-05-04 13:53:55 +0000268 vis->AlphaBits = alphaBits;
Brian Paul4d053dd2000-01-14 04:45:47 +0000269
Brian Paulb371e0d2000-03-31 01:05:51 +0000270 vis->IndexBits = indexBits;
271 vis->DepthBits = depthBits;
272 vis->AccumRedBits = (accumRedBits > 0) ? (8 * sizeof(GLaccum)) : 0;
273 vis->AccumGreenBits = (accumGreenBits > 0) ? (8 * sizeof(GLaccum)) : 0;
274 vis->AccumBlueBits = (accumBlueBits > 0) ? (8 * sizeof(GLaccum)) : 0;
275 vis->AccumAlphaBits = (accumAlphaBits > 0) ? (8 * sizeof(GLaccum)) : 0;
276 vis->StencilBits = (stencilBits > 0) ? (8 * sizeof(GLstencil)) : 0;
Brian Paul4d053dd2000-01-14 04:45:47 +0000277
Brian Pauled30dfa2000-03-03 17:47:39 +0000278 if (depthBits == 0) {
279 /* Special case. Even if we don't have a depth buffer we need
Brian Paul35324a62000-10-09 22:42:40 +0000280 * good values for DepthMax for Z vertex transformation purposes
281 * and for per-fragment fog computation.
Brian Pauled30dfa2000-03-03 17:47:39 +0000282 */
Brian Paul35324a62000-10-09 22:42:40 +0000283 vis->DepthMax = 1 << 16;
284 vis->DepthMaxF = (GLfloat) vis->DepthMax;
Brian Pauled30dfa2000-03-03 17:47:39 +0000285 }
Brian Paul3a94f5c2000-05-18 18:12:36 +0000286 else if (depthBits < 32) {
Brian Pauled30dfa2000-03-03 17:47:39 +0000287 vis->DepthMax = (1 << depthBits) - 1;
288 vis->DepthMaxF = (GLfloat) vis->DepthMax;
289 }
Brian Paul3a94f5c2000-05-18 18:12:36 +0000290 else {
291 /* Special case since shift values greater than or equal to the
292 * number of bits in the left hand expression's type are
293 * undefined.
294 */
295 vis->DepthMax = 0xffffffff;
296 vis->DepthMaxF = (GLfloat) vis->DepthMax;
297 }
Brian Pauld0d7d622000-10-21 00:02:47 +0000298 vis->MRD = 1; /* XXX temporary value */
Brian Pauled30dfa2000-03-03 17:47:39 +0000299
Brian Paul178a1c52000-04-22 01:05:00 +0000300 return GL_TRUE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000301}
302
303
Brian Paulb371e0d2000-03-31 01:05:51 +0000304void
305_mesa_destroy_visual( GLvisual *vis )
306{
307 FREE(vis);
308}
309
310
Brian Paul4d053dd2000-01-14 04:45:47 +0000311/**********************************************************************/
312/***** GL Framebuffer allocation/destruction *****/
313/**********************************************************************/
314
315
316/*
317 * Create a new framebuffer. A GLframebuffer is a struct which
318 * encapsulates the depth, stencil and accum buffers and related
319 * parameters.
320 * Input: visual - a GLvisual pointer
321 * softwareDepth - create/use a software depth buffer?
322 * softwareStencil - create/use a software stencil buffer?
323 * softwareAccum - create/use a software accum buffer?
324 * softwareAlpha - create/use a software alpha buffer?
325
326 * Return: pointer to new GLframebuffer struct or NULL if error.
327 */
Brian Paul178a1c52000-04-22 01:05:00 +0000328GLframebuffer *
Brian Paulb1394fa2000-09-26 20:53:53 +0000329_mesa_create_framebuffer( GLvisual *visual,
330 GLboolean softwareDepth,
331 GLboolean softwareStencil,
332 GLboolean softwareAccum,
333 GLboolean softwareAlpha )
Brian Paul4d053dd2000-01-14 04:45:47 +0000334{
Brian Paul178a1c52000-04-22 01:05:00 +0000335 GLframebuffer *buffer = CALLOC_STRUCT(gl_frame_buffer);
336 assert(visual);
337 if (buffer) {
338 _mesa_initialize_framebuffer(buffer, visual,
339 softwareDepth, softwareStencil,
340 softwareAccum, softwareAlpha );
Brian Paul4d053dd2000-01-14 04:45:47 +0000341 }
Brian Paul178a1c52000-04-22 01:05:00 +0000342 return buffer;
343}
344
345
346/*
347 * Initialize a GLframebuffer object.
Brian Paulb1394fa2000-09-26 20:53:53 +0000348 * Input: See _mesa_create_framebuffer() above.
Brian Paul178a1c52000-04-22 01:05:00 +0000349 */
350void
351_mesa_initialize_framebuffer( GLframebuffer *buffer,
352 GLvisual *visual,
353 GLboolean softwareDepth,
354 GLboolean softwareStencil,
355 GLboolean softwareAccum,
356 GLboolean softwareAlpha )
357{
358 assert(buffer);
359 assert(visual);
Brian Paul4d053dd2000-01-14 04:45:47 +0000360
361 /* sanity checks */
362 if (softwareDepth ) {
363 assert(visual->DepthBits > 0);
364 }
365 if (softwareStencil) {
366 assert(visual->StencilBits > 0);
367 }
368 if (softwareAccum) {
369 assert(visual->RGBAflag);
Brian Paulb371e0d2000-03-31 01:05:51 +0000370 assert(visual->AccumRedBits > 0);
371 assert(visual->AccumGreenBits > 0);
372 assert(visual->AccumBlueBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000373 }
374 if (softwareAlpha) {
375 assert(visual->RGBAflag);
376 assert(visual->AlphaBits > 0);
377 }
378
379 buffer->Visual = visual;
380 buffer->UseSoftwareDepthBuffer = softwareDepth;
381 buffer->UseSoftwareStencilBuffer = softwareStencil;
382 buffer->UseSoftwareAccumBuffer = softwareAccum;
383 buffer->UseSoftwareAlphaBuffers = softwareAlpha;
Brian Paul4d053dd2000-01-14 04:45:47 +0000384}
385
386
Brian Paul4d053dd2000-01-14 04:45:47 +0000387/*
388 * Free a framebuffer struct and its buffers.
389 */
Brian Paul178a1c52000-04-22 01:05:00 +0000390void
Brian Paulb1394fa2000-09-26 20:53:53 +0000391_mesa_destroy_framebuffer( GLframebuffer *buffer )
Brian Paul4d053dd2000-01-14 04:45:47 +0000392{
393 if (buffer) {
Brian Paul650cb742000-03-17 15:31:52 +0000394 if (buffer->DepthBuffer) {
395 FREE( buffer->DepthBuffer );
Brian Paul4d053dd2000-01-14 04:45:47 +0000396 }
397 if (buffer->Accum) {
398 FREE( buffer->Accum );
399 }
400 if (buffer->Stencil) {
401 FREE( buffer->Stencil );
402 }
403 if (buffer->FrontLeftAlpha) {
404 FREE( buffer->FrontLeftAlpha );
405 }
406 if (buffer->BackLeftAlpha) {
407 FREE( buffer->BackLeftAlpha );
408 }
409 if (buffer->FrontRightAlpha) {
410 FREE( buffer->FrontRightAlpha );
411 }
412 if (buffer->BackRightAlpha) {
413 FREE( buffer->BackRightAlpha );
414 }
415 FREE(buffer);
416 }
417}
418
419
420
421/**********************************************************************/
jtgafb833d1999-08-19 00:55:39 +0000422/***** Context allocation, initialization, destroying *****/
423/**********************************************************************/
424
425
Brian Paul9560f052000-01-31 23:11:39 +0000426_glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
427
428
jtgafb833d1999-08-19 00:55:39 +0000429/*
430 * This function just calls all the various one-time-init functions in Mesa.
431 */
Brian Paul178a1c52000-04-22 01:05:00 +0000432static void
433one_time_init( void )
jtgafb833d1999-08-19 00:55:39 +0000434{
435 static GLboolean alreadyCalled = GL_FALSE;
Brian Paul9560f052000-01-31 23:11:39 +0000436 _glthread_LOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000437 if (!alreadyCalled) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000438 /* do some implementation tests */
439 assert( sizeof(GLbyte) == 1 );
440 assert( sizeof(GLshort) >= 2 );
441 assert( sizeof(GLint) >= 4 );
442 assert( sizeof(GLubyte) == 1 );
443 assert( sizeof(GLushort) >= 2 );
444 assert( sizeof(GLuint) >= 4 );
445
jtgafb833d1999-08-19 00:55:39 +0000446 gl_init_clip();
447 gl_init_eval();
Brian Paul5829f0c2000-02-02 22:21:39 +0000448 _mesa_init_fog();
Brian Paul780c4e02000-03-22 23:20:12 +0000449 _mesa_init_math();
jtgafb833d1999-08-19 00:55:39 +0000450 gl_init_lists();
451 gl_init_shade();
452 gl_init_texture();
453 gl_init_transformation();
454 gl_init_translate();
455 gl_init_vbrender();
456 gl_init_vbxform();
Gareth Hughesfc2427e2000-10-23 00:16:28 +0000457 gl_init_vertices();
Brian Paul68ee4bc2000-01-28 19:02:22 +0000458
459 if (getenv("MESA_DEBUG")) {
460 _glapi_noop_enable_warnings(GL_TRUE);
461 }
462 else {
463 _glapi_noop_enable_warnings(GL_FALSE);
464 }
465
jtgafb833d1999-08-19 00:55:39 +0000466#if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
467 fprintf(stderr, "Mesa DEBUG build %s %s\n", __DATE__, __TIME__);
468#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000469
470 alreadyCalled = GL_TRUE;
471 }
Brian Paul9560f052000-01-31 23:11:39 +0000472 _glthread_UNLOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000473}
474
475
Brian Paul4d053dd2000-01-14 04:45:47 +0000476
jtgafb833d1999-08-19 00:55:39 +0000477/*
478 * Allocate and initialize a shared context state structure.
479 */
Brian Paul178a1c52000-04-22 01:05:00 +0000480static struct gl_shared_state *
481alloc_shared_state( void )
jtgafb833d1999-08-19 00:55:39 +0000482{
Brian Paul6e6d4c61999-10-09 20:17:07 +0000483 GLuint d;
jtgafb833d1999-08-19 00:55:39 +0000484 struct gl_shared_state *ss;
485 GLboolean outOfMemory;
486
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000487 ss = CALLOC_STRUCT(gl_shared_state);
jtgafb833d1999-08-19 00:55:39 +0000488 if (!ss)
489 return NULL;
490
Brian Paule4b684c2000-09-12 21:07:40 +0000491 _glthread_INIT_MUTEX(ss->Mutex);
jtgafb833d1999-08-19 00:55:39 +0000492
Brian Paule4b684c2000-09-12 21:07:40 +0000493 ss->DisplayList = _mesa_NewHashTable();
Brian Paulbb797902000-01-24 16:19:54 +0000494 ss->TexObjects = _mesa_NewHashTable();
jtgafb833d1999-08-19 00:55:39 +0000495
496 /* Default Texture objects */
497 outOfMemory = GL_FALSE;
Brian Paul6e6d4c61999-10-09 20:17:07 +0000498 for (d = 1 ; d <= 3 ; d++) {
499 ss->DefaultD[d] = gl_alloc_texture_object(ss, 0, d);
500 if (!ss->DefaultD[d]) {
501 outOfMemory = GL_TRUE;
502 break;
jtgafb833d1999-08-19 00:55:39 +0000503 }
Brian Paul6e6d4c61999-10-09 20:17:07 +0000504 ss->DefaultD[d]->RefCount++; /* don't free if not in use */
jtgafb833d1999-08-19 00:55:39 +0000505 }
506
Brian Paul413d6a22000-05-26 14:44:59 +0000507 ss->DefaultCubeMap = gl_alloc_texture_object(ss, 0, 6);
508 if (!ss->DefaultCubeMap) {
509 outOfMemory = GL_TRUE;
510 }
511 else {
512 ss->DefaultCubeMap->RefCount++;
513 }
514
jtgafb833d1999-08-19 00:55:39 +0000515 if (!ss->DisplayList || !ss->TexObjects || outOfMemory) {
516 /* Ran out of memory at some point. Free everything and return NULL */
517 if (ss->DisplayList)
Brian Paulbb797902000-01-24 16:19:54 +0000518 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000519 if (ss->TexObjects)
Brian Paulbb797902000-01-24 16:19:54 +0000520 _mesa_DeleteHashTable(ss->TexObjects);
Brian Paul6e6d4c61999-10-09 20:17:07 +0000521 if (ss->DefaultD[1])
522 gl_free_texture_object(ss, ss->DefaultD[1]);
523 if (ss->DefaultD[2])
524 gl_free_texture_object(ss, ss->DefaultD[2]);
525 if (ss->DefaultD[3])
526 gl_free_texture_object(ss, ss->DefaultD[3]);
Brian Paul413d6a22000-05-26 14:44:59 +0000527 if (ss->DefaultCubeMap)
528 gl_free_texture_object(ss, ss->DefaultCubeMap);
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000529 FREE(ss);
jtgafb833d1999-08-19 00:55:39 +0000530 return NULL;
531 }
532 else {
533 return ss;
534 }
535}
536
537
538/*
539 * Deallocate a shared state context and all children structures.
540 */
Brian Paul178a1c52000-04-22 01:05:00 +0000541static void
542free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
jtgafb833d1999-08-19 00:55:39 +0000543{
544 /* Free display lists */
545 while (1) {
Brian Paulbb797902000-01-24 16:19:54 +0000546 GLuint list = _mesa_HashFirstEntry(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000547 if (list) {
548 gl_destroy_list(ctx, list);
549 }
550 else {
551 break;
552 }
553 }
Brian Paulbb797902000-01-24 16:19:54 +0000554 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000555
556 /* Free texture objects */
557 while (ss->TexObjectList)
558 {
559 if (ctx->Driver.DeleteTexture)
560 (*ctx->Driver.DeleteTexture)( ctx, ss->TexObjectList );
561 /* this function removes from linked list too! */
562 gl_free_texture_object(ss, ss->TexObjectList);
563 }
Brian Paulbb797902000-01-24 16:19:54 +0000564 _mesa_DeleteHashTable(ss->TexObjects);
jtgafb833d1999-08-19 00:55:39 +0000565
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000566 FREE(ss);
jtgafb833d1999-08-19 00:55:39 +0000567}
568
569
570
jtgafb833d1999-08-19 00:55:39 +0000571/*
572 * Initialize the nth light. Note that the defaults for light 0 are
573 * different than the other lights.
574 */
Brian Paul178a1c52000-04-22 01:05:00 +0000575static void
576init_light( struct gl_light *l, GLuint n )
jtgafb833d1999-08-19 00:55:39 +0000577{
578 make_empty_list( l );
579
580 ASSIGN_4V( l->Ambient, 0.0, 0.0, 0.0, 1.0 );
581 if (n==0) {
582 ASSIGN_4V( l->Diffuse, 1.0, 1.0, 1.0, 1.0 );
583 ASSIGN_4V( l->Specular, 1.0, 1.0, 1.0, 1.0 );
584 }
585 else {
586 ASSIGN_4V( l->Diffuse, 0.0, 0.0, 0.0, 1.0 );
587 ASSIGN_4V( l->Specular, 0.0, 0.0, 0.0, 1.0 );
588 }
589 ASSIGN_4V( l->EyePosition, 0.0, 0.0, 1.0, 0.0 );
590 ASSIGN_3V( l->EyeDirection, 0.0, 0.0, -1.0 );
591 l->SpotExponent = 0.0;
592 gl_compute_spot_exp_table( l );
593 l->SpotCutoff = 180.0;
594 l->CosCutoff = 0.0; /* KW: -ve values not admitted */
595 l->ConstantAttenuation = 1.0;
596 l->LinearAttenuation = 0.0;
597 l->QuadraticAttenuation = 0.0;
598 l->Enabled = GL_FALSE;
599}
600
601
602
Brian Paul178a1c52000-04-22 01:05:00 +0000603static void
604init_lightmodel( struct gl_lightmodel *lm )
jtgafb833d1999-08-19 00:55:39 +0000605{
606 ASSIGN_4V( lm->Ambient, 0.2, 0.2, 0.2, 1.0 );
607 lm->LocalViewer = GL_FALSE;
608 lm->TwoSide = GL_FALSE;
609 lm->ColorControl = GL_SINGLE_COLOR;
610}
611
612
Brian Paul178a1c52000-04-22 01:05:00 +0000613static void
614init_material( struct gl_material *m )
jtgafb833d1999-08-19 00:55:39 +0000615{
616 ASSIGN_4V( m->Ambient, 0.2, 0.2, 0.2, 1.0 );
617 ASSIGN_4V( m->Diffuse, 0.8, 0.8, 0.8, 1.0 );
618 ASSIGN_4V( m->Specular, 0.0, 0.0, 0.0, 1.0 );
619 ASSIGN_4V( m->Emission, 0.0, 0.0, 0.0, 1.0 );
620 m->Shininess = 0.0;
621 m->AmbientIndex = 0;
622 m->DiffuseIndex = 1;
623 m->SpecularIndex = 1;
624}
625
626
627
Brian Paul178a1c52000-04-22 01:05:00 +0000628static void
629init_texture_unit( GLcontext *ctx, GLuint unit )
jtgafb833d1999-08-19 00:55:39 +0000630{
631 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
632
633 texUnit->EnvMode = GL_MODULATE;
Brian Paul24507ff2000-06-27 21:42:13 +0000634 texUnit->CombineModeRGB = GL_MODULATE;
635 texUnit->CombineModeA = GL_MODULATE;
636 texUnit->CombineSourceRGB[0] = GL_TEXTURE;
637 texUnit->CombineSourceRGB[1] = GL_PREVIOUS_EXT;
638 texUnit->CombineSourceRGB[2] = GL_CONSTANT_EXT;
639 texUnit->CombineSourceA[0] = GL_TEXTURE;
640 texUnit->CombineSourceA[1] = GL_PREVIOUS_EXT;
641 texUnit->CombineSourceA[2] = GL_CONSTANT_EXT;
642 texUnit->CombineOperandRGB[0] = GL_SRC_COLOR;
643 texUnit->CombineOperandRGB[1] = GL_SRC_COLOR;
644 texUnit->CombineOperandRGB[2] = GL_SRC_ALPHA;
645 texUnit->CombineOperandA[0] = GL_SRC_ALPHA;
646 texUnit->CombineOperandA[1] = GL_SRC_ALPHA;
647 texUnit->CombineOperandA[2] = GL_SRC_ALPHA;
648 texUnit->CombineScaleShiftRGB = 0;
649 texUnit->CombineScaleShiftA = 0;
650
jtgafb833d1999-08-19 00:55:39 +0000651 ASSIGN_4V( texUnit->EnvColor, 0.0, 0.0, 0.0, 0.0 );
652 texUnit->TexGenEnabled = 0;
653 texUnit->GenModeS = GL_EYE_LINEAR;
654 texUnit->GenModeT = GL_EYE_LINEAR;
655 texUnit->GenModeR = GL_EYE_LINEAR;
656 texUnit->GenModeQ = GL_EYE_LINEAR;
Brian Paul26f3b052000-07-19 20:58:59 +0000657 texUnit->GenBitS = TEXGEN_EYE_LINEAR;
658 texUnit->GenBitT = TEXGEN_EYE_LINEAR;
659 texUnit->GenBitR = TEXGEN_EYE_LINEAR;
660 texUnit->GenBitQ = TEXGEN_EYE_LINEAR;
661
jtgafb833d1999-08-19 00:55:39 +0000662 /* Yes, these plane coefficients are correct! */
663 ASSIGN_4V( texUnit->ObjectPlaneS, 1.0, 0.0, 0.0, 0.0 );
664 ASSIGN_4V( texUnit->ObjectPlaneT, 0.0, 1.0, 0.0, 0.0 );
665 ASSIGN_4V( texUnit->ObjectPlaneR, 0.0, 0.0, 0.0, 0.0 );
666 ASSIGN_4V( texUnit->ObjectPlaneQ, 0.0, 0.0, 0.0, 0.0 );
667 ASSIGN_4V( texUnit->EyePlaneS, 1.0, 0.0, 0.0, 0.0 );
668 ASSIGN_4V( texUnit->EyePlaneT, 0.0, 1.0, 0.0, 0.0 );
669 ASSIGN_4V( texUnit->EyePlaneR, 0.0, 0.0, 0.0, 0.0 );
670 ASSIGN_4V( texUnit->EyePlaneQ, 0.0, 0.0, 0.0, 0.0 );
671
Brian Paul6e6d4c61999-10-09 20:17:07 +0000672 texUnit->CurrentD[1] = ctx->Shared->DefaultD[1];
673 texUnit->CurrentD[2] = ctx->Shared->DefaultD[2];
674 texUnit->CurrentD[3] = ctx->Shared->DefaultD[3];
Brian Paul413d6a22000-05-26 14:44:59 +0000675 texUnit->CurrentCubeMap = ctx->Shared->DefaultCubeMap;
jtgafb833d1999-08-19 00:55:39 +0000676}
677
678
Brian Paul178a1c52000-04-22 01:05:00 +0000679static void
680init_fallback_arrays( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000681{
682 struct gl_client_array *cl;
683 GLuint i;
684
685 cl = &ctx->Fallback.Normal;
686 cl->Size = 3;
687 cl->Type = GL_FLOAT;
688 cl->Stride = 0;
689 cl->StrideB = 0;
690 cl->Ptr = (void *) ctx->Current.Normal;
691 cl->Enabled = 1;
692
693 cl = &ctx->Fallback.Color;
694 cl->Size = 4;
695 cl->Type = GL_UNSIGNED_BYTE;
696 cl->Stride = 0;
697 cl->StrideB = 0;
698 cl->Ptr = (void *) ctx->Current.ByteColor;
699 cl->Enabled = 1;
700
701 cl = &ctx->Fallback.Index;
702 cl->Size = 1;
703 cl->Type = GL_UNSIGNED_INT;
704 cl->Stride = 0;
705 cl->StrideB = 0;
706 cl->Ptr = (void *) &ctx->Current.Index;
707 cl->Enabled = 1;
708
709 for (i = 0 ; i < MAX_TEXTURE_UNITS ; i++) {
710 cl = &ctx->Fallback.TexCoord[i];
711 cl->Size = 4;
712 cl->Type = GL_FLOAT;
713 cl->Stride = 0;
714 cl->StrideB = 0;
715 cl->Ptr = (void *) ctx->Current.Texcoord[i];
716 cl->Enabled = 1;
717 }
718
719 cl = &ctx->Fallback.EdgeFlag;
720 cl->Size = 1;
721 cl->Type = GL_UNSIGNED_BYTE;
722 cl->Stride = 0;
723 cl->StrideB = 0;
724 cl->Ptr = (void *) &ctx->Current.EdgeFlag;
725 cl->Enabled = 1;
726}
727
Brian Paul4d053dd2000-01-14 04:45:47 +0000728
jtgafb833d1999-08-19 00:55:39 +0000729/* Initialize a 1-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000730static void
731init_1d_map( struct gl_1d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000732{
733 map->Order = 1;
734 map->u1 = 0.0;
735 map->u2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000736 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000737 if (map->Points) {
738 GLint i;
739 for (i=0;i<n;i++)
740 map->Points[i] = initial[i];
741 }
jtgafb833d1999-08-19 00:55:39 +0000742}
743
744
745/* Initialize a 2-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000746static void
747init_2d_map( struct gl_2d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000748{
749 map->Uorder = 1;
750 map->Vorder = 1;
751 map->u1 = 0.0;
752 map->u2 = 1.0;
753 map->v1 = 0.0;
754 map->v2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000755 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000756 if (map->Points) {
757 GLint i;
758 for (i=0;i<n;i++)
759 map->Points[i] = initial[i];
760 }
jtgafb833d1999-08-19 00:55:39 +0000761}
762
763
jtgafb833d1999-08-19 00:55:39 +0000764/*
Brian Paul4d053dd2000-01-14 04:45:47 +0000765 * Initialize the attribute groups in a GLcontext.
jtgafb833d1999-08-19 00:55:39 +0000766 */
Brian Paul178a1c52000-04-22 01:05:00 +0000767static void
768init_attrib_groups( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000769{
770 GLuint i, j;
771
Brian Paul4d053dd2000-01-14 04:45:47 +0000772 assert(ctx);
jtgafb833d1999-08-19 00:55:39 +0000773
Brian Paul539cce52000-02-03 19:40:07 +0000774 /* Constants, may be overriden by device drivers */
Brian Paul4d053dd2000-01-14 04:45:47 +0000775 ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
776 ctx->Const.MaxTextureSize = 1 << (MAX_TEXTURE_LEVELS - 1);
Brian Paul86fc3702000-05-22 16:33:20 +0000777 ctx->Const.MaxCubeTextureSize = ctx->Const.MaxTextureSize;
Brian Paul4d053dd2000-01-14 04:45:47 +0000778 ctx->Const.MaxTextureUnits = MAX_TEXTURE_UNITS;
779 ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
Brian Paul539cce52000-02-03 19:40:07 +0000780 ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
781 ctx->Const.MinPointSize = MIN_POINT_SIZE;
782 ctx->Const.MaxPointSize = MAX_POINT_SIZE;
783 ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
784 ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
785 ctx->Const.PointSizeGranularity = POINT_SIZE_GRANULARITY;
786 ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
787 ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
788 ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
789 ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
790 ctx->Const.LineWidthGranularity = LINE_WIDTH_GRANULARITY;
791 ctx->Const.NumAuxBuffers = NUM_AUX_BUFFERS;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000792 ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
Brian Paul82b02f02000-05-07 20:37:40 +0000793 ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
794 ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
Brian Paul1207bf02000-05-23 20:10:49 +0000795 ctx->Const.NumCompressedTextureFormats = 0;
jtgafb833d1999-08-19 00:55:39 +0000796
Brian Paul4d053dd2000-01-14 04:45:47 +0000797 /* Modelview matrix */
798 gl_matrix_ctr( &ctx->ModelView );
799 gl_matrix_alloc_inv( &ctx->ModelView );
800
801 ctx->ModelViewStackDepth = 0;
Brian Paul7fc29c52000-03-06 17:03:03 +0000802 for (i = 0; i < MAX_MODELVIEW_STACK_DEPTH - 1; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000803 gl_matrix_ctr( &ctx->ModelViewStack[i] );
804 gl_matrix_alloc_inv( &ctx->ModelViewStack[i] );
805 }
806
807 /* Projection matrix - need inv for user clipping in clip space*/
808 gl_matrix_ctr( &ctx->ProjectionMatrix );
809 gl_matrix_alloc_inv( &ctx->ProjectionMatrix );
810
811 gl_matrix_ctr( &ctx->ModelProjectMatrix );
812 gl_matrix_ctr( &ctx->ModelProjectWinMatrix );
813 ctx->ModelProjectWinMatrixUptodate = GL_FALSE;
814
815 ctx->ProjectionStackDepth = 0;
816 ctx->NearFarStack[0][0] = 1.0; /* These values seem weird by make */
817 ctx->NearFarStack[0][1] = 0.0; /* sense mathematically. */
818
Brian Paul7fc29c52000-03-06 17:03:03 +0000819 for (i = 0; i < MAX_PROJECTION_STACK_DEPTH - 1; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000820 gl_matrix_ctr( &ctx->ProjectionStack[i] );
821 gl_matrix_alloc_inv( &ctx->ProjectionStack[i] );
822 }
823
824 /* Texture matrix */
Brian Paul904ecb22000-06-27 23:38:45 +0000825 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000826 gl_matrix_ctr( &ctx->TextureMatrix[i] );
827 ctx->TextureStackDepth[i] = 0;
Brian Paul7fc29c52000-03-06 17:03:03 +0000828 for (j = 0; j < MAX_TEXTURE_STACK_DEPTH - 1; j++) {
Brian Paul904ecb22000-06-27 23:38:45 +0000829 gl_matrix_ctr( &ctx->TextureStack[i][j] );
Brian Paul4d053dd2000-01-14 04:45:47 +0000830 ctx->TextureStack[i][j].inv = 0;
jtgafb833d1999-08-19 00:55:39 +0000831 }
Brian Paul4d053dd2000-01-14 04:45:47 +0000832 }
jtgafb833d1999-08-19 00:55:39 +0000833
Brian Paul250069d2000-04-08 18:57:45 +0000834 /* Color matrix */
835 gl_matrix_ctr(&ctx->ColorMatrix);
836 ctx->ColorStackDepth = 0;
837 for (j = 0; j < MAX_COLOR_STACK_DEPTH - 1; j++) {
838 gl_matrix_ctr(&ctx->ColorStack[j]);
839 }
840
Brian Paul4d053dd2000-01-14 04:45:47 +0000841 /* Accumulate buffer group */
842 ASSIGN_4V( ctx->Accum.ClearColor, 0.0, 0.0, 0.0, 0.0 );
jtgafb833d1999-08-19 00:55:39 +0000843
Brian Paul4d053dd2000-01-14 04:45:47 +0000844 /* Color buffer group */
845 ctx->Color.IndexMask = 0xffffffff;
846 ctx->Color.ColorMask[0] = 0xff;
847 ctx->Color.ColorMask[1] = 0xff;
848 ctx->Color.ColorMask[2] = 0xff;
849 ctx->Color.ColorMask[3] = 0xff;
Brian Paul4d053dd2000-01-14 04:45:47 +0000850 ctx->Color.ClearIndex = 0;
851 ASSIGN_4V( ctx->Color.ClearColor, 0.0, 0.0, 0.0, 0.0 );
852 ctx->Color.DrawBuffer = GL_FRONT;
853 ctx->Color.AlphaEnabled = GL_FALSE;
854 ctx->Color.AlphaFunc = GL_ALWAYS;
855 ctx->Color.AlphaRef = 0;
856 ctx->Color.BlendEnabled = GL_FALSE;
857 ctx->Color.BlendSrcRGB = GL_ONE;
858 ctx->Color.BlendDstRGB = GL_ZERO;
859 ctx->Color.BlendSrcA = GL_ONE;
860 ctx->Color.BlendDstA = GL_ZERO;
861 ctx->Color.BlendEquation = GL_FUNC_ADD_EXT;
862 ctx->Color.BlendFunc = NULL; /* this pointer set only when needed */
863 ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 );
864 ctx->Color.IndexLogicOpEnabled = GL_FALSE;
865 ctx->Color.ColorLogicOpEnabled = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000866 ctx->Color.LogicOp = GL_COPY;
867 ctx->Color.DitherFlag = GL_TRUE;
868 ctx->Color.MultiDrawBuffer = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000869
Brian Paul4d053dd2000-01-14 04:45:47 +0000870 /* Current group */
871 ASSIGN_4V( ctx->Current.ByteColor, 255, 255, 255, 255);
872 ctx->Current.Index = 1;
873 for (i=0; i<MAX_TEXTURE_UNITS; i++)
874 ASSIGN_4V( ctx->Current.Texcoord[i], 0.0, 0.0, 0.0, 1.0 );
875 ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
876 ctx->Current.RasterDistance = 0.0;
877 ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
878 ctx->Current.RasterIndex = 1;
879 for (i=0; i<MAX_TEXTURE_UNITS; i++)
880 ASSIGN_4V( ctx->Current.RasterMultiTexCoord[i], 0.0, 0.0, 0.0, 1.0 );
881 ctx->Current.RasterTexCoord = ctx->Current.RasterMultiTexCoord[0];
882 ctx->Current.RasterPosValid = GL_TRUE;
883 ctx->Current.EdgeFlag = GL_TRUE;
884 ASSIGN_3V( ctx->Current.Normal, 0.0, 0.0, 1.0 );
885 ctx->Current.Primitive = (GLenum) (GL_POLYGON + 1);
jtgafb833d1999-08-19 00:55:39 +0000886
Brian Pauld4757302000-10-20 19:54:49 +0000887 ctx->Current.Flag = (VERT_NORM |
Gareth Hughesfc2427e2000-10-23 00:16:28 +0000888 VERT_INDEX |
Brian Pauld4757302000-10-20 19:54:49 +0000889 VERT_RGBA |
890 VERT_EDGE |
891 VERT_TEX0_1 |
892 VERT_TEX1_1 |
893 VERT_TEX2_1 | /* XXX fix for MAX_TEXTURE_UNITS > 3 */
894 VERT_MATERIAL);
jtgafb833d1999-08-19 00:55:39 +0000895
Brian Paul4d053dd2000-01-14 04:45:47 +0000896 init_fallback_arrays( ctx );
jtgafb833d1999-08-19 00:55:39 +0000897
Brian Paul4d053dd2000-01-14 04:45:47 +0000898 /* Depth buffer group */
899 ctx->Depth.Test = GL_FALSE;
900 ctx->Depth.Clear = 1.0;
901 ctx->Depth.Func = GL_LESS;
902 ctx->Depth.Mask = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +0000903 ctx->Depth.OcclusionTest = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000904
Brian Paul4d053dd2000-01-14 04:45:47 +0000905 /* Evaluators group */
906 ctx->Eval.Map1Color4 = GL_FALSE;
907 ctx->Eval.Map1Index = GL_FALSE;
908 ctx->Eval.Map1Normal = GL_FALSE;
909 ctx->Eval.Map1TextureCoord1 = GL_FALSE;
910 ctx->Eval.Map1TextureCoord2 = GL_FALSE;
911 ctx->Eval.Map1TextureCoord3 = GL_FALSE;
912 ctx->Eval.Map1TextureCoord4 = GL_FALSE;
913 ctx->Eval.Map1Vertex3 = GL_FALSE;
914 ctx->Eval.Map1Vertex4 = GL_FALSE;
915 ctx->Eval.Map2Color4 = GL_FALSE;
916 ctx->Eval.Map2Index = GL_FALSE;
917 ctx->Eval.Map2Normal = GL_FALSE;
918 ctx->Eval.Map2TextureCoord1 = GL_FALSE;
919 ctx->Eval.Map2TextureCoord2 = GL_FALSE;
920 ctx->Eval.Map2TextureCoord3 = GL_FALSE;
921 ctx->Eval.Map2TextureCoord4 = GL_FALSE;
922 ctx->Eval.Map2Vertex3 = GL_FALSE;
923 ctx->Eval.Map2Vertex4 = GL_FALSE;
924 ctx->Eval.AutoNormal = GL_FALSE;
925 ctx->Eval.MapGrid1un = 1;
926 ctx->Eval.MapGrid1u1 = 0.0;
927 ctx->Eval.MapGrid1u2 = 1.0;
928 ctx->Eval.MapGrid2un = 1;
929 ctx->Eval.MapGrid2vn = 1;
930 ctx->Eval.MapGrid2u1 = 0.0;
931 ctx->Eval.MapGrid2u2 = 1.0;
932 ctx->Eval.MapGrid2v1 = 0.0;
933 ctx->Eval.MapGrid2v2 = 1.0;
jtgafb833d1999-08-19 00:55:39 +0000934
Brian Paul4d053dd2000-01-14 04:45:47 +0000935 /* Evaluator data */
936 {
937 static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
938 static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
939 static GLfloat index[1] = { 1.0 };
940 static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
941 static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
jtgafb833d1999-08-19 00:55:39 +0000942
Brian Paul4d053dd2000-01-14 04:45:47 +0000943 init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
944 init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
945 init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
946 init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
947 init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
948 init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
949 init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
950 init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
951 init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
jtgafb833d1999-08-19 00:55:39 +0000952
Brian Paul4d053dd2000-01-14 04:45:47 +0000953 init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
954 init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
955 init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
956 init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
957 init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
958 init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
959 init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
960 init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
961 init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
962 }
jtgafb833d1999-08-19 00:55:39 +0000963
Brian Paul4d053dd2000-01-14 04:45:47 +0000964 /* Fog group */
965 ctx->Fog.Enabled = GL_FALSE;
966 ctx->Fog.Mode = GL_EXP;
967 ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
968 ctx->Fog.Index = 0.0;
969 ctx->Fog.Density = 1.0;
970 ctx->Fog.Start = 0.0;
971 ctx->Fog.End = 1.0;
jtgafb833d1999-08-19 00:55:39 +0000972
Brian Paul4d053dd2000-01-14 04:45:47 +0000973 /* Hint group */
974 ctx->Hint.PerspectiveCorrection = GL_DONT_CARE;
975 ctx->Hint.PointSmooth = GL_DONT_CARE;
976 ctx->Hint.LineSmooth = GL_DONT_CARE;
977 ctx->Hint.PolygonSmooth = GL_DONT_CARE;
978 ctx->Hint.Fog = GL_DONT_CARE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000979 ctx->Hint.AllowDrawWin = GL_TRUE;
Brian Paul8cce3142000-04-10 15:52:25 +0000980 ctx->Hint.AllowDrawFrg = GL_TRUE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000981 ctx->Hint.AllowDrawMem = GL_TRUE;
982 ctx->Hint.StrictLighting = GL_TRUE;
Brian Paul1207bf02000-05-23 20:10:49 +0000983 ctx->Hint.ClipVolumeClipping = GL_DONT_CARE;
984 ctx->Hint.TextureCompression = GL_DONT_CARE;
jtgafb833d1999-08-19 00:55:39 +0000985
Brian Paul0771d152000-04-07 00:19:41 +0000986 /* Histogram group */
987 ctx->Histogram.Width = 0;
988 ctx->Histogram.Format = GL_RGBA;
989 ctx->Histogram.Sink = GL_FALSE;
990 ctx->Histogram.RedSize = 0xffffffff;
991 ctx->Histogram.GreenSize = 0xffffffff;
992 ctx->Histogram.BlueSize = 0xffffffff;
993 ctx->Histogram.AlphaSize = 0xffffffff;
994 ctx->Histogram.LuminanceSize = 0xffffffff;
995 for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
996 ctx->Histogram.Count[i][0] = 0;
997 ctx->Histogram.Count[i][1] = 0;
998 ctx->Histogram.Count[i][2] = 0;
999 ctx->Histogram.Count[i][3] = 0;
1000 }
1001
1002 /* Min/Max group */
1003 ctx->MinMax.Format = GL_RGBA;
1004 ctx->MinMax.Sink = GL_FALSE;
1005 ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000;
1006 ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000;
1007 ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000;
1008 ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000;
1009
Brian Paul4d053dd2000-01-14 04:45:47 +00001010 /* Pipeline */
1011 gl_pipeline_init( ctx );
1012 gl_cva_init( ctx );
jtgafb833d1999-08-19 00:55:39 +00001013
Brian Paul4d053dd2000-01-14 04:45:47 +00001014 /* Extensions */
1015 gl_extensions_ctr( ctx );
jtgafb833d1999-08-19 00:55:39 +00001016
Brian Paul4d053dd2000-01-14 04:45:47 +00001017 ctx->AllowVertexCull = CLIP_CULLED_BIT;
jtgafb833d1999-08-19 00:55:39 +00001018
Brian Paul4d053dd2000-01-14 04:45:47 +00001019 /* Lighting group */
1020 for (i=0;i<MAX_LIGHTS;i++) {
1021 init_light( &ctx->Light.Light[i], i );
1022 }
1023 make_empty_list( &ctx->Light.EnabledList );
jtgafb833d1999-08-19 00:55:39 +00001024
Brian Paul4d053dd2000-01-14 04:45:47 +00001025 init_lightmodel( &ctx->Light.Model );
1026 init_material( &ctx->Light.Material[0] );
1027 init_material( &ctx->Light.Material[1] );
1028 ctx->Light.ShadeModel = GL_SMOOTH;
1029 ctx->Light.Enabled = GL_FALSE;
1030 ctx->Light.ColorMaterialFace = GL_FRONT_AND_BACK;
1031 ctx->Light.ColorMaterialMode = GL_AMBIENT_AND_DIFFUSE;
1032 ctx->Light.ColorMaterialBitmask
1033 = gl_material_bitmask( ctx,
1034 GL_FRONT_AND_BACK,
1035 GL_AMBIENT_AND_DIFFUSE, ~0, 0 );
jtgafb833d1999-08-19 00:55:39 +00001036
Brian Paul4d053dd2000-01-14 04:45:47 +00001037 ctx->Light.ColorMaterialEnabled = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001038
Brian Paul4d053dd2000-01-14 04:45:47 +00001039 /* Lighting miscellaneous */
1040 ctx->ShineTabList = MALLOC_STRUCT( gl_shine_tab );
1041 make_empty_list( ctx->ShineTabList );
1042 for (i = 0 ; i < 10 ; i++) {
1043 struct gl_shine_tab *s = MALLOC_STRUCT( gl_shine_tab );
1044 s->shininess = -1;
1045 s->refcount = 0;
1046 insert_at_tail( ctx->ShineTabList, s );
1047 }
1048 for (i = 0 ; i < 4 ; i++) {
1049 ctx->ShineTable[i] = ctx->ShineTabList->prev;
1050 ctx->ShineTable[i]->refcount++;
1051 }
jtgafb833d1999-08-19 00:55:39 +00001052
Brian Paul77d61af2000-06-28 04:20:21 +00001053 gl_compute_shine_table( ctx, 0, ctx->Light.Material[0].Shininess );
1054 gl_compute_shine_table( ctx, 2, ctx->Light.Material[0].Shininess * .5 );
1055 gl_compute_shine_table( ctx, 1, ctx->Light.Material[1].Shininess );
1056 gl_compute_shine_table( ctx, 3, ctx->Light.Material[1].Shininess * .5 );
1057
jtgafb833d1999-08-19 00:55:39 +00001058
Brian Paul4d053dd2000-01-14 04:45:47 +00001059 /* Line group */
1060 ctx->Line.SmoothFlag = GL_FALSE;
1061 ctx->Line.StippleFlag = GL_FALSE;
1062 ctx->Line.Width = 1.0;
1063 ctx->Line.StipplePattern = 0xffff;
1064 ctx->Line.StippleFactor = 1;
jtgafb833d1999-08-19 00:55:39 +00001065
Brian Paul4d053dd2000-01-14 04:45:47 +00001066 /* Display List group */
1067 ctx->List.ListBase = 0;
jtgafb833d1999-08-19 00:55:39 +00001068
Brian Paul4d053dd2000-01-14 04:45:47 +00001069 /* Pixel group */
1070 ctx->Pixel.RedBias = 0.0;
1071 ctx->Pixel.RedScale = 1.0;
1072 ctx->Pixel.GreenBias = 0.0;
1073 ctx->Pixel.GreenScale = 1.0;
1074 ctx->Pixel.BlueBias = 0.0;
1075 ctx->Pixel.BlueScale = 1.0;
1076 ctx->Pixel.AlphaBias = 0.0;
1077 ctx->Pixel.AlphaScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001078 ctx->Pixel.DepthBias = 0.0;
1079 ctx->Pixel.DepthScale = 1.0;
1080 ctx->Pixel.IndexOffset = 0;
1081 ctx->Pixel.IndexShift = 0;
1082 ctx->Pixel.ZoomX = 1.0;
1083 ctx->Pixel.ZoomY = 1.0;
1084 ctx->Pixel.MapColorFlag = GL_FALSE;
1085 ctx->Pixel.MapStencilFlag = GL_FALSE;
1086 ctx->Pixel.MapStoSsize = 1;
1087 ctx->Pixel.MapItoIsize = 1;
1088 ctx->Pixel.MapItoRsize = 1;
1089 ctx->Pixel.MapItoGsize = 1;
1090 ctx->Pixel.MapItoBsize = 1;
1091 ctx->Pixel.MapItoAsize = 1;
1092 ctx->Pixel.MapRtoRsize = 1;
1093 ctx->Pixel.MapGtoGsize = 1;
1094 ctx->Pixel.MapBtoBsize = 1;
1095 ctx->Pixel.MapAtoAsize = 1;
1096 ctx->Pixel.MapStoS[0] = 0;
1097 ctx->Pixel.MapItoI[0] = 0;
1098 ctx->Pixel.MapItoR[0] = 0.0;
1099 ctx->Pixel.MapItoG[0] = 0.0;
1100 ctx->Pixel.MapItoB[0] = 0.0;
1101 ctx->Pixel.MapItoA[0] = 0.0;
1102 ctx->Pixel.MapItoR8[0] = 0;
1103 ctx->Pixel.MapItoG8[0] = 0;
1104 ctx->Pixel.MapItoB8[0] = 0;
1105 ctx->Pixel.MapItoA8[0] = 0;
1106 ctx->Pixel.MapRtoR[0] = 0.0;
1107 ctx->Pixel.MapGtoG[0] = 0.0;
1108 ctx->Pixel.MapBtoB[0] = 0.0;
1109 ctx->Pixel.MapAtoA[0] = 0.0;
Brian Paul2b2e9252000-04-07 16:27:26 +00001110 ctx->Pixel.HistogramEnabled = GL_FALSE;
1111 ctx->Pixel.MinMaxEnabled = GL_FALSE;
1112 ctx->Pixel.PixelTextureEnabled = GL_FALSE;
1113 ctx->Pixel.FragmentRgbSource = GL_PIXEL_GROUP_COLOR_SGIS;
1114 ctx->Pixel.FragmentAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS;
Brian Paul82b02f02000-05-07 20:37:40 +00001115 ASSIGN_4V(ctx->Pixel.PostColorMatrixScale, 1.0, 1.0, 1.0, 1.0);
1116 ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0);
1117 ASSIGN_4V(ctx->Pixel.ColorTableScale, 1.0, 1.0, 1.0, 1.0);
1118 ASSIGN_4V(ctx->Pixel.ColorTableBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul6c50e162000-06-30 22:11:04 +00001119 ASSIGN_4V(ctx->Pixel.PCCTscale, 1.0, 1.0, 1.0, 1.0);
1120 ASSIGN_4V(ctx->Pixel.PCCTbias, 0.0, 0.0, 0.0, 0.0);
1121 ASSIGN_4V(ctx->Pixel.PCMCTscale, 1.0, 1.0, 1.0, 1.0);
1122 ASSIGN_4V(ctx->Pixel.PCMCTbias, 0.0, 0.0, 0.0, 0.0);
Brian Paul4fe34b22000-04-11 15:07:48 +00001123 ctx->Pixel.ColorTableEnabled = GL_FALSE;
1124 ctx->Pixel.PostConvolutionColorTableEnabled = GL_FALSE;
1125 ctx->Pixel.PostColorMatrixColorTableEnabled = GL_FALSE;
Brian Paul82b02f02000-05-07 20:37:40 +00001126 ctx->Pixel.Convolution1DEnabled = GL_FALSE;
1127 ctx->Pixel.Convolution2DEnabled = GL_FALSE;
1128 ctx->Pixel.Separable2DEnabled = GL_FALSE;
1129 for (i = 0; i < 3; i++) {
1130 ASSIGN_4V(ctx->Pixel.ConvolutionBorderColor[i], 0.0, 0.0, 0.0, 0.0);
1131 ctx->Pixel.ConvolutionBorderMode[i] = GL_REDUCE;
1132 ASSIGN_4V(ctx->Pixel.ConvolutionFilterScale[i], 1.0, 1.0, 1.0, 1.0);
1133 ASSIGN_4V(ctx->Pixel.ConvolutionFilterBias[i], 0.0, 0.0, 0.0, 0.0);
1134 }
1135 ASSIGN_4V(ctx->Pixel.PostConvolutionScale, 1.0, 1.0, 1.0, 1.0);
1136 ASSIGN_4V(ctx->Pixel.PostConvolutionBias, 0.0, 0.0, 0.0, 0.0);
jtgafb833d1999-08-19 00:55:39 +00001137
Brian Paul4d053dd2000-01-14 04:45:47 +00001138 /* Point group */
1139 ctx->Point.SmoothFlag = GL_FALSE;
Brian Paula25f7e12000-06-27 04:29:22 +00001140 ctx->Point.UserSize = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001141 ctx->Point.Size = 1.0;
1142 ctx->Point.Params[0] = 1.0;
1143 ctx->Point.Params[1] = 0.0;
1144 ctx->Point.Params[2] = 0.0;
1145 ctx->Point.Attenuated = GL_FALSE;
1146 ctx->Point.MinSize = 0.0;
1147 ctx->Point.MaxSize = (GLfloat) MAX_POINT_SIZE;
1148 ctx->Point.Threshold = 1.0;
jtgafb833d1999-08-19 00:55:39 +00001149
Brian Paul4d053dd2000-01-14 04:45:47 +00001150 /* Polygon group */
1151 ctx->Polygon.CullFlag = GL_FALSE;
1152 ctx->Polygon.CullFaceMode = GL_BACK;
1153 ctx->Polygon.FrontFace = GL_CCW;
1154 ctx->Polygon.FrontBit = 0;
1155 ctx->Polygon.FrontMode = GL_FILL;
1156 ctx->Polygon.BackMode = GL_FILL;
1157 ctx->Polygon.Unfilled = GL_FALSE;
1158 ctx->Polygon.SmoothFlag = GL_FALSE;
1159 ctx->Polygon.StippleFlag = GL_FALSE;
1160 ctx->Polygon.OffsetFactor = 0.0F;
1161 ctx->Polygon.OffsetUnits = 0.0F;
Brian Pauld0d7d622000-10-21 00:02:47 +00001162 ctx->Polygon.OffsetMRD = 0.0F;
Brian Paul4d053dd2000-01-14 04:45:47 +00001163 ctx->Polygon.OffsetPoint = GL_FALSE;
1164 ctx->Polygon.OffsetLine = GL_FALSE;
1165 ctx->Polygon.OffsetFill = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001166
Brian Paul4d053dd2000-01-14 04:45:47 +00001167 /* Polygon Stipple group */
1168 MEMSET( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) );
jtgafb833d1999-08-19 00:55:39 +00001169
Brian Paul4d053dd2000-01-14 04:45:47 +00001170 /* Scissor group */
1171 ctx->Scissor.Enabled = GL_FALSE;
1172 ctx->Scissor.X = 0;
1173 ctx->Scissor.Y = 0;
1174 ctx->Scissor.Width = 0;
1175 ctx->Scissor.Height = 0;
jtgafb833d1999-08-19 00:55:39 +00001176
Brian Paul4d053dd2000-01-14 04:45:47 +00001177 /* Stencil group */
1178 ctx->Stencil.Enabled = GL_FALSE;
1179 ctx->Stencil.Function = GL_ALWAYS;
1180 ctx->Stencil.FailFunc = GL_KEEP;
1181 ctx->Stencil.ZPassFunc = GL_KEEP;
1182 ctx->Stencil.ZFailFunc = GL_KEEP;
1183 ctx->Stencil.Ref = 0;
1184 ctx->Stencil.ValueMask = STENCIL_MAX;
1185 ctx->Stencil.Clear = 0;
1186 ctx->Stencil.WriteMask = STENCIL_MAX;
jtgafb833d1999-08-19 00:55:39 +00001187
Brian Paul4d053dd2000-01-14 04:45:47 +00001188 /* Texture group */
1189 ctx->Texture.CurrentUnit = 0; /* multitexture */
1190 ctx->Texture.CurrentTransformUnit = 0; /* multitexture */
Brian Paul23316032000-09-14 23:13:23 +00001191 ctx->Texture.ReallyEnabled = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001192 for (i=0; i<MAX_TEXTURE_UNITS; i++)
1193 init_texture_unit( ctx, i );
Brian Paul23316032000-09-14 23:13:23 +00001194 ctx->Texture.SharedPalette = GL_FALSE;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001195 _mesa_init_colortable(&ctx->Texture.Palette);
jtgafb833d1999-08-19 00:55:39 +00001196
Brian Paul4d053dd2000-01-14 04:45:47 +00001197 /* Transformation group */
1198 ctx->Transform.MatrixMode = GL_MODELVIEW;
1199 ctx->Transform.Normalize = GL_FALSE;
1200 ctx->Transform.RescaleNormals = GL_FALSE;
1201 for (i=0;i<MAX_CLIP_PLANES;i++) {
1202 ctx->Transform.ClipEnabled[i] = GL_FALSE;
1203 ASSIGN_4V( ctx->Transform.EyeUserPlane[i], 0.0, 0.0, 0.0, 0.0 );
1204 }
1205 ctx->Transform.AnyClip = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001206
Brian Paul4d053dd2000-01-14 04:45:47 +00001207 /* Viewport group */
1208 ctx->Viewport.X = 0;
1209 ctx->Viewport.Y = 0;
1210 ctx->Viewport.Width = 0;
1211 ctx->Viewport.Height = 0;
1212 ctx->Viewport.Near = 0.0;
1213 ctx->Viewport.Far = 1.0;
1214 gl_matrix_ctr(&ctx->Viewport.WindowMap);
jtgafb833d1999-08-19 00:55:39 +00001215
1216#define Sz 10
1217#define Tz 14
Brian Paulb1394fa2000-09-26 20:53:53 +00001218 ctx->Viewport.WindowMap.m[Sz] = 0.5 * ctx->Visual.DepthMaxF;
1219 ctx->Viewport.WindowMap.m[Tz] = 0.5 * ctx->Visual.DepthMaxF;
jtgafb833d1999-08-19 00:55:39 +00001220#undef Sz
1221#undef Tz
1222
Brian Paul4d053dd2000-01-14 04:45:47 +00001223 ctx->Viewport.WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION;
1224 ctx->Viewport.WindowMap.type = MATRIX_3D_NO_ROT;
jtgafb833d1999-08-19 00:55:39 +00001225
Brian Paul4d053dd2000-01-14 04:45:47 +00001226 /* Vertex arrays */
1227 ctx->Array.Vertex.Size = 4;
1228 ctx->Array.Vertex.Type = GL_FLOAT;
1229 ctx->Array.Vertex.Stride = 0;
1230 ctx->Array.Vertex.StrideB = 0;
1231 ctx->Array.Vertex.Ptr = NULL;
1232 ctx->Array.Vertex.Enabled = GL_FALSE;
1233 ctx->Array.Normal.Type = GL_FLOAT;
1234 ctx->Array.Normal.Stride = 0;
1235 ctx->Array.Normal.StrideB = 0;
1236 ctx->Array.Normal.Ptr = NULL;
1237 ctx->Array.Normal.Enabled = GL_FALSE;
1238 ctx->Array.Color.Size = 4;
1239 ctx->Array.Color.Type = GL_FLOAT;
1240 ctx->Array.Color.Stride = 0;
1241 ctx->Array.Color.StrideB = 0;
1242 ctx->Array.Color.Ptr = NULL;
1243 ctx->Array.Color.Enabled = GL_FALSE;
1244 ctx->Array.Index.Type = GL_FLOAT;
1245 ctx->Array.Index.Stride = 0;
1246 ctx->Array.Index.StrideB = 0;
1247 ctx->Array.Index.Ptr = NULL;
1248 ctx->Array.Index.Enabled = GL_FALSE;
1249 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
1250 ctx->Array.TexCoord[i].Size = 4;
1251 ctx->Array.TexCoord[i].Type = GL_FLOAT;
1252 ctx->Array.TexCoord[i].Stride = 0;
1253 ctx->Array.TexCoord[i].StrideB = 0;
1254 ctx->Array.TexCoord[i].Ptr = NULL;
1255 ctx->Array.TexCoord[i].Enabled = GL_FALSE;
1256 }
1257 ctx->Array.TexCoordInterleaveFactor = 1;
1258 ctx->Array.EdgeFlag.Stride = 0;
1259 ctx->Array.EdgeFlag.StrideB = 0;
1260 ctx->Array.EdgeFlag.Ptr = NULL;
1261 ctx->Array.EdgeFlag.Enabled = GL_FALSE;
1262 ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */
1263
1264 /* Pixel transfer */
1265 ctx->Pack.Alignment = 4;
1266 ctx->Pack.RowLength = 0;
1267 ctx->Pack.ImageHeight = 0;
1268 ctx->Pack.SkipPixels = 0;
1269 ctx->Pack.SkipRows = 0;
1270 ctx->Pack.SkipImages = 0;
1271 ctx->Pack.SwapBytes = GL_FALSE;
1272 ctx->Pack.LsbFirst = GL_FALSE;
1273 ctx->Unpack.Alignment = 4;
1274 ctx->Unpack.RowLength = 0;
1275 ctx->Unpack.ImageHeight = 0;
1276 ctx->Unpack.SkipPixels = 0;
1277 ctx->Unpack.SkipRows = 0;
1278 ctx->Unpack.SkipImages = 0;
1279 ctx->Unpack.SwapBytes = GL_FALSE;
1280 ctx->Unpack.LsbFirst = GL_FALSE;
1281
1282 /* Feedback */
1283 ctx->Feedback.Type = GL_2D; /* TODO: verify */
1284 ctx->Feedback.Buffer = NULL;
1285 ctx->Feedback.BufferSize = 0;
1286 ctx->Feedback.Count = 0;
1287
1288 /* Selection/picking */
1289 ctx->Select.Buffer = NULL;
1290 ctx->Select.BufferSize = 0;
1291 ctx->Select.BufferCount = 0;
1292 ctx->Select.Hits = 0;
1293 ctx->Select.NameStackDepth = 0;
1294
1295 /* Optimized Accum buffer */
1296 ctx->IntegerAccumMode = GL_TRUE;
1297 ctx->IntegerAccumScaler = 0.0;
1298
1299 /* Renderer and client attribute stacks */
1300 ctx->AttribStackDepth = 0;
1301 ctx->ClientAttribStackDepth = 0;
1302
Brian Paul13811372000-04-12 00:27:37 +00001303 /* Display list */
1304 ctx->CallDepth = 0;
1305 ctx->ExecuteFlag = GL_TRUE;
1306 ctx->CompileFlag = GL_FALSE;
1307 ctx->CurrentListPtr = NULL;
1308 ctx->CurrentBlock = NULL;
1309 ctx->CurrentListNum = 0;
1310 ctx->CurrentPos = 0;
1311
1312 /* Color tables */
Brian Paul4bdcfe52000-04-17 17:57:04 +00001313 _mesa_init_colortable(&ctx->ColorTable);
1314 _mesa_init_colortable(&ctx->ProxyColorTable);
1315 _mesa_init_colortable(&ctx->PostConvolutionColorTable);
1316 _mesa_init_colortable(&ctx->ProxyPostConvolutionColorTable);
1317 _mesa_init_colortable(&ctx->PostColorMatrixColorTable);
1318 _mesa_init_colortable(&ctx->ProxyPostColorMatrixColorTable);
Brian Paul13811372000-04-12 00:27:37 +00001319
Brian Paul4d053dd2000-01-14 04:45:47 +00001320 /* Miscellaneous */
1321 ctx->NewState = NEW_ALL;
1322 ctx->RenderMode = GL_RENDER;
1323 ctx->StippleCounter = 0;
1324 ctx->NeedNormals = GL_FALSE;
1325 ctx->DoViewportMapping = GL_TRUE;
Brian Paulfa4525e2000-08-21 14:22:24 +00001326 ctx->ImageTransferState = UPDATE_IMAGE_TRANSFER_STATE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001327
1328 ctx->NeedEyeCoords = GL_FALSE;
1329 ctx->NeedEyeNormals = GL_FALSE;
1330 ctx->vb_proj_matrix = &ctx->ModelProjectMatrix;
1331
Brian Paul4d053dd2000-01-14 04:45:47 +00001332 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
1333
1334 ctx->CatchSignals = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001335 ctx->OcclusionResult = GL_FALSE;
Brian Paul7e67fb42000-04-04 15:14:10 +00001336 ctx->OcclusionResultSaved = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001337
1338 /* For debug/development only */
1339 ctx->NoRaster = getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
1340 ctx->FirstTimeCurrent = GL_TRUE;
1341
1342 /* Dither disable */
1343 ctx->NoDither = getenv("MESA_NO_DITHER") ? GL_TRUE : GL_FALSE;
1344 if (ctx->NoDither) {
1345 if (getenv("MESA_DEBUG")) {
1346 fprintf(stderr, "MESA_NO_DITHER set - dithering disabled\n");
jtgafb833d1999-08-19 00:55:39 +00001347 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001348 ctx->Color.DitherFlag = GL_FALSE;
Brian Paul00037781999-12-17 14:52:35 +00001349 }
1350}
1351
1352
1353
1354
jtgafb833d1999-08-19 00:55:39 +00001355/*
1356 * Allocate the proxy textures. If we run out of memory part way through
1357 * the allocations clean up and return GL_FALSE.
1358 * Return: GL_TRUE=success, GL_FALSE=failure
1359 */
Brian Paul178a1c52000-04-22 01:05:00 +00001360static GLboolean
1361alloc_proxy_textures( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001362{
1363 GLboolean out_of_memory;
1364 GLint i;
1365
1366 ctx->Texture.Proxy1D = gl_alloc_texture_object(NULL, 0, 1);
1367 if (!ctx->Texture.Proxy1D) {
1368 return GL_FALSE;
1369 }
1370
1371 ctx->Texture.Proxy2D = gl_alloc_texture_object(NULL, 0, 2);
1372 if (!ctx->Texture.Proxy2D) {
1373 gl_free_texture_object(NULL, ctx->Texture.Proxy1D);
1374 return GL_FALSE;
1375 }
1376
1377 ctx->Texture.Proxy3D = gl_alloc_texture_object(NULL, 0, 3);
1378 if (!ctx->Texture.Proxy3D) {
1379 gl_free_texture_object(NULL, ctx->Texture.Proxy1D);
1380 gl_free_texture_object(NULL, ctx->Texture.Proxy2D);
1381 return GL_FALSE;
1382 }
1383
1384 out_of_memory = GL_FALSE;
1385 for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
Brian Paul021a5252000-03-27 17:54:17 +00001386 ctx->Texture.Proxy1D->Image[i] = _mesa_alloc_texture_image();
1387 ctx->Texture.Proxy2D->Image[i] = _mesa_alloc_texture_image();
1388 ctx->Texture.Proxy3D->Image[i] = _mesa_alloc_texture_image();
jtgafb833d1999-08-19 00:55:39 +00001389 if (!ctx->Texture.Proxy1D->Image[i]
1390 || !ctx->Texture.Proxy2D->Image[i]
1391 || !ctx->Texture.Proxy3D->Image[i]) {
1392 out_of_memory = GL_TRUE;
1393 }
1394 }
1395 if (out_of_memory) {
1396 for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
1397 if (ctx->Texture.Proxy1D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001398 _mesa_free_texture_image(ctx->Texture.Proxy1D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001399 }
1400 if (ctx->Texture.Proxy2D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001401 _mesa_free_texture_image(ctx->Texture.Proxy2D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001402 }
1403 if (ctx->Texture.Proxy3D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001404 _mesa_free_texture_image(ctx->Texture.Proxy3D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001405 }
1406 }
1407 gl_free_texture_object(NULL, ctx->Texture.Proxy1D);
1408 gl_free_texture_object(NULL, ctx->Texture.Proxy2D);
1409 gl_free_texture_object(NULL, ctx->Texture.Proxy3D);
1410 return GL_FALSE;
1411 }
1412 else {
1413 return GL_TRUE;
1414 }
1415}
1416
1417
jtgafb833d1999-08-19 00:55:39 +00001418/*
Brian Paul8aee2a32000-08-29 18:57:58 +00001419 * Initialize a GLcontext struct. This includes allocating all the
1420 * other structs and arrays which hang off of the context by pointers.
jtgafb833d1999-08-19 00:55:39 +00001421 */
Brian Paul178a1c52000-04-22 01:05:00 +00001422GLboolean
1423_mesa_initialize_context( GLcontext *ctx,
1424 GLvisual *visual,
1425 GLcontext *share_list,
1426 void *driver_ctx,
1427 GLboolean direct )
jtgafb833d1999-08-19 00:55:39 +00001428{
Brian Paul5fb84d22000-05-24 15:04:45 +00001429 GLuint dispatchSize;
1430
jtgafb833d1999-08-19 00:55:39 +00001431 (void) direct; /* not used */
1432
jtgafb833d1999-08-19 00:55:39 +00001433 /* misc one-time initializations */
1434 one_time_init();
1435
Brian Paulb1394fa2000-09-26 20:53:53 +00001436 /**
1437 ** OpenGL SI stuff
1438 **/
1439 if (!ctx->imports.malloc) {
1440 _mesa_InitDefaultImports(&ctx->imports, driver_ctx, NULL);
1441 }
1442 /* exports are setup by the device driver */
1443
jtgafb833d1999-08-19 00:55:39 +00001444 ctx->DriverCtx = driver_ctx;
Brian Paulb1394fa2000-09-26 20:53:53 +00001445 ctx->Visual = *visual;
Brian Paul3f02f901999-11-24 18:48:30 +00001446 ctx->DrawBuffer = NULL;
1447 ctx->ReadBuffer = NULL;
jtgafb833d1999-08-19 00:55:39 +00001448
1449 ctx->VB = gl_vb_create_for_immediate( ctx );
1450 if (!ctx->VB) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001451 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001452 }
1453 ctx->input = ctx->VB->IM;
1454
1455 ctx->PB = gl_alloc_pb();
1456 if (!ctx->PB) {
Brian Paul2d8db392000-06-27 22:10:00 +00001457 ALIGN_FREE( ctx->VB );
Brian Paul4d053dd2000-01-14 04:45:47 +00001458 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001459 }
1460
1461 if (share_list) {
1462 /* share the group of display lists of another context */
1463 ctx->Shared = share_list->Shared;
1464 }
1465 else {
1466 /* allocate new group of display lists */
1467 ctx->Shared = alloc_shared_state();
1468 if (!ctx->Shared) {
Brian Paul2d8db392000-06-27 22:10:00 +00001469 ALIGN_FREE( ctx->VB );
1470 FREE( ctx->PB );
Brian Paul4d053dd2000-01-14 04:45:47 +00001471 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001472 }
1473 }
Brian Paul9560f052000-01-31 23:11:39 +00001474 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001475 ctx->Shared->RefCount++;
Brian Paul9560f052000-01-31 23:11:39 +00001476 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001477
Brian Paul4d053dd2000-01-14 04:45:47 +00001478 init_attrib_groups( ctx );
1479
jtgafb833d1999-08-19 00:55:39 +00001480 gl_reset_vb( ctx->VB );
1481 gl_reset_input( ctx );
1482
jtgafb833d1999-08-19 00:55:39 +00001483 if (visual->DBflag) {
1484 ctx->Color.DrawBuffer = GL_BACK;
1485 ctx->Color.DriverDrawBuffer = GL_BACK_LEFT;
1486 ctx->Color.DrawDestMask = BACK_LEFT_BIT;
1487 ctx->Pixel.ReadBuffer = GL_BACK;
1488 ctx->Pixel.DriverReadBuffer = GL_BACK_LEFT;
1489 }
1490 else {
1491 ctx->Color.DrawBuffer = GL_FRONT;
1492 ctx->Color.DriverDrawBuffer = GL_FRONT_LEFT;
1493 ctx->Color.DrawDestMask = FRONT_LEFT_BIT;
1494 ctx->Pixel.ReadBuffer = GL_FRONT;
1495 ctx->Pixel.DriverReadBuffer = GL_FRONT_LEFT;
1496 }
1497
jtgafb833d1999-08-19 00:55:39 +00001498 if (!alloc_proxy_textures(ctx)) {
1499 free_shared_state(ctx, ctx->Shared);
Brian Paul2d8db392000-06-27 22:10:00 +00001500 ALIGN_FREE( ctx->VB );
1501 FREE( ctx->PB );
Brian Paul4d053dd2000-01-14 04:45:47 +00001502 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001503 }
jtgafb833d1999-08-19 00:55:39 +00001504
Brian Paulf59afc92000-05-23 23:23:00 +00001505 /* register the most recent extension functions with libGL */
1506 _glapi_add_entrypoint("glTbufferMask3DFX", 553);
1507 _glapi_add_entrypoint("glCompressedTexImage3DARB", 554);
1508 _glapi_add_entrypoint("glCompressedTexImage2DARB", 555);
1509 _glapi_add_entrypoint("glCompressedTexImage1DARB", 556);
1510 _glapi_add_entrypoint("glCompressedTexSubImage3DARB", 557);
1511 _glapi_add_entrypoint("glCompressedTexSubImage2DARB", 558);
1512 _glapi_add_entrypoint("glCompressedTexSubImage1DARB", 559);
1513 _glapi_add_entrypoint("glGetCompressedTexImageARB", 560);
1514
Brian Paul5fb84d22000-05-24 15:04:45 +00001515 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
1516 * In practice, this'll be the same for stand-alone Mesa. But for DRI
1517 * Mesa we do this to accomodate different versions of libGL and various
1518 * DRI drivers.
1519 */
1520 dispatchSize = MAX2(_glapi_get_dispatch_table_size(),
1521 sizeof(struct _glapi_table) / sizeof(void *));
1522
Brian Paulfbd8f211999-11-11 01:22:25 +00001523 /* setup API dispatch tables */
Brian Paul5fb84d22000-05-24 15:04:45 +00001524 ctx->Exec = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
1525 ctx->Save = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001526 if (!ctx->Exec || !ctx->Save) {
1527 free_shared_state(ctx, ctx->Shared);
Brian Paul2d8db392000-06-27 22:10:00 +00001528 ALIGN_FREE( ctx->VB );
1529 FREE( ctx->PB );
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001530 if (ctx->Exec)
Brian Paul2d8db392000-06-27 22:10:00 +00001531 FREE( ctx->Exec );
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001532 }
Brian Paul5fb84d22000-05-24 15:04:45 +00001533 _mesa_init_exec_table(ctx->Exec, dispatchSize);
1534 _mesa_init_dlist_table(ctx->Save, dispatchSize);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001535 ctx->CurrentDispatch = ctx->Exec;
jtgafb833d1999-08-19 00:55:39 +00001536
Brian Paul3b18a362000-09-26 15:27:20 +00001537#if defined(MESA_TRACE)
Brian Paul45f36342000-09-05 20:28:06 +00001538 ctx->TraceCtx = CALLOC( sizeof(trace_context_t) );
1539#if 0
1540 /* Brian: do you want to have CreateContext fail here,
1541 or should we just trap in NewTrace (currently done)? */
1542 if (!(ctx->TraceCtx)) {
1543 free_shared_state(ctx, ctx->Shared);
1544 ALIGN_FREE( ctx->VB );
1545 FREE( ctx->PB );
1546 FREE( ctx->Exec );
1547 FREE( ctx->Save );
1548 return GL_FALSE;
1549 }
1550#endif
1551 trInitContext(ctx->TraceCtx);
1552
1553 ctx->TraceDispatch = (struct _glapi_table *)
1554 CALLOC(dispatchSize * sizeof(void*));
1555#if 0
1556 if (!(ctx->TraceCtx)) {
1557 free_shared_state(ctx, ctx->Shared);
1558 ALIGN_FREE( ctx->VB );
1559 FREE( ctx->PB );
1560 FREE( ctx->Exec );
1561 FREE( ctx->Save );
1562 FREE( ctx->TraceCtx );
1563 return GL_FALSE;
1564 }
1565#endif
1566 trInitDispatch(ctx->TraceDispatch);
1567#endif
1568
Brian Paul4d053dd2000-01-14 04:45:47 +00001569 return GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001570}
1571
jtgafb833d1999-08-19 00:55:39 +00001572
1573
1574/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001575 * Allocate and initialize a GLcontext structure.
1576 * Input: visual - a GLvisual pointer
1577 * sharelist - another context to share display lists with or NULL
1578 * driver_ctx - pointer to device driver's context state struct
Brian Paulb1394fa2000-09-26 20:53:53 +00001579 * Return: pointer to a new __GLcontextRec or NULL if error.
Brian Paul4d053dd2000-01-14 04:45:47 +00001580 */
Brian Paul178a1c52000-04-22 01:05:00 +00001581GLcontext *
Brian Paulb1394fa2000-09-26 20:53:53 +00001582_mesa_create_context( GLvisual *visual,
1583 GLcontext *share_list,
1584 void *driver_ctx,
1585 GLboolean direct )
Brian Paul4d053dd2000-01-14 04:45:47 +00001586{
1587 GLcontext *ctx = (GLcontext *) CALLOC( sizeof(GLcontext) );
1588 if (!ctx) {
1589 return NULL;
1590 }
1591
Brian Paul178a1c52000-04-22 01:05:00 +00001592 if (_mesa_initialize_context(ctx, visual, share_list, driver_ctx, direct)) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001593 return ctx;
1594 }
1595 else {
1596 FREE(ctx);
1597 return NULL;
1598 }
1599}
1600
1601
1602
1603/*
1604 * Free the data associated with the given context.
1605 * But don't free() the GLcontext struct itself!
1606 */
Brian Paul178a1c52000-04-22 01:05:00 +00001607void
Brian Paulb1394fa2000-09-26 20:53:53 +00001608_mesa_free_context_data( GLcontext *ctx )
Brian Paul4d053dd2000-01-14 04:45:47 +00001609{
Brian Paul4d053dd2000-01-14 04:45:47 +00001610 struct gl_shine_tab *s, *tmps;
Brian Paul7fc29c52000-03-06 17:03:03 +00001611 GLuint i, j;
Brian Paul4d053dd2000-01-14 04:45:47 +00001612
1613 /* if we're destroying the current context, unbind it first */
Brian Paulb1394fa2000-09-26 20:53:53 +00001614 if (ctx == _mesa_get_current_context()) {
1615 _mesa_make_current(NULL, NULL);
Brian Paul4d053dd2000-01-14 04:45:47 +00001616 }
1617
Brian Paul4d053dd2000-01-14 04:45:47 +00001618 gl_matrix_dtr( &ctx->ModelView );
Brian Paul7fc29c52000-03-06 17:03:03 +00001619 for (i = 0; i < MAX_MODELVIEW_STACK_DEPTH - 1; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001620 gl_matrix_dtr( &ctx->ModelViewStack[i] );
1621 }
1622 gl_matrix_dtr( &ctx->ProjectionMatrix );
Brian Paul7fc29c52000-03-06 17:03:03 +00001623 for (i = 0; i < MAX_PROJECTION_STACK_DEPTH - 1; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001624 gl_matrix_dtr( &ctx->ProjectionStack[i] );
1625 }
Brian Paul7fc29c52000-03-06 17:03:03 +00001626 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
1627 gl_matrix_dtr( &ctx->TextureMatrix[i] );
1628 for (j = 0; j < MAX_TEXTURE_STACK_DEPTH - 1; j++) {
1629 gl_matrix_dtr( &ctx->TextureStack[i][j] );
1630 }
1631 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001632
1633 FREE( ctx->PB );
1634
Brian Paul4bdcfe52000-04-17 17:57:04 +00001635 if (ctx->input != ctx->VB->IM)
Brian Paul4d053dd2000-01-14 04:45:47 +00001636 gl_immediate_free( ctx->input );
1637
1638 gl_vb_free( ctx->VB );
1639
Brian Paul9560f052000-01-31 23:11:39 +00001640 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
Brian Paul4d053dd2000-01-14 04:45:47 +00001641 ctx->Shared->RefCount--;
Brian Paul9560f052000-01-31 23:11:39 +00001642 assert(ctx->Shared->RefCount >= 0);
1643 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1644 if (ctx->Shared->RefCount == 0) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001645 /* free shared state */
1646 free_shared_state( ctx, ctx->Shared );
1647 }
1648
1649 foreach_s( s, tmps, ctx->ShineTabList ) {
1650 FREE( s );
1651 }
1652 FREE( ctx->ShineTabList );
1653
1654 /* Free proxy texture objects */
1655 gl_free_texture_object( NULL, ctx->Texture.Proxy1D );
1656 gl_free_texture_object( NULL, ctx->Texture.Proxy2D );
1657 gl_free_texture_object( NULL, ctx->Texture.Proxy3D );
1658
1659 /* Free evaluator data */
1660 if (ctx->EvalMap.Map1Vertex3.Points)
1661 FREE( ctx->EvalMap.Map1Vertex3.Points );
1662 if (ctx->EvalMap.Map1Vertex4.Points)
1663 FREE( ctx->EvalMap.Map1Vertex4.Points );
1664 if (ctx->EvalMap.Map1Index.Points)
1665 FREE( ctx->EvalMap.Map1Index.Points );
1666 if (ctx->EvalMap.Map1Color4.Points)
1667 FREE( ctx->EvalMap.Map1Color4.Points );
1668 if (ctx->EvalMap.Map1Normal.Points)
1669 FREE( ctx->EvalMap.Map1Normal.Points );
1670 if (ctx->EvalMap.Map1Texture1.Points)
1671 FREE( ctx->EvalMap.Map1Texture1.Points );
1672 if (ctx->EvalMap.Map1Texture2.Points)
1673 FREE( ctx->EvalMap.Map1Texture2.Points );
1674 if (ctx->EvalMap.Map1Texture3.Points)
1675 FREE( ctx->EvalMap.Map1Texture3.Points );
1676 if (ctx->EvalMap.Map1Texture4.Points)
1677 FREE( ctx->EvalMap.Map1Texture4.Points );
1678
1679 if (ctx->EvalMap.Map2Vertex3.Points)
1680 FREE( ctx->EvalMap.Map2Vertex3.Points );
1681 if (ctx->EvalMap.Map2Vertex4.Points)
1682 FREE( ctx->EvalMap.Map2Vertex4.Points );
1683 if (ctx->EvalMap.Map2Index.Points)
1684 FREE( ctx->EvalMap.Map2Index.Points );
1685 if (ctx->EvalMap.Map2Color4.Points)
1686 FREE( ctx->EvalMap.Map2Color4.Points );
1687 if (ctx->EvalMap.Map2Normal.Points)
1688 FREE( ctx->EvalMap.Map2Normal.Points );
1689 if (ctx->EvalMap.Map2Texture1.Points)
1690 FREE( ctx->EvalMap.Map2Texture1.Points );
1691 if (ctx->EvalMap.Map2Texture2.Points)
1692 FREE( ctx->EvalMap.Map2Texture2.Points );
1693 if (ctx->EvalMap.Map2Texture3.Points)
1694 FREE( ctx->EvalMap.Map2Texture3.Points );
1695 if (ctx->EvalMap.Map2Texture4.Points)
1696 FREE( ctx->EvalMap.Map2Texture4.Points );
1697
Brian Paul4bdcfe52000-04-17 17:57:04 +00001698 _mesa_free_colortable_data( &ctx->ColorTable );
1699 _mesa_free_colortable_data( &ctx->PostConvolutionColorTable );
1700 _mesa_free_colortable_data( &ctx->PostColorMatrixColorTable );
1701 _mesa_free_colortable_data( &ctx->Texture.Palette );
1702
Brian Paul4d053dd2000-01-14 04:45:47 +00001703 /* Free cache of immediate buffers. */
1704 while (ctx->nr_im_queued-- > 0) {
1705 struct immediate * next = ctx->freed_im_queue->next;
Brian Paul2d8db392000-06-27 22:10:00 +00001706 ALIGN_FREE( ctx->freed_im_queue );
Brian Paul4d053dd2000-01-14 04:45:47 +00001707 ctx->freed_im_queue = next;
1708 }
1709 gl_extensions_dtr(ctx);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001710
1711 FREE(ctx->Exec);
1712 FREE(ctx->Save);
Brian Paul4d053dd2000-01-14 04:45:47 +00001713}
1714
1715
1716
1717/*
1718 * Destroy a GLcontext structure.
jtgafb833d1999-08-19 00:55:39 +00001719 */
Brian Paul178a1c52000-04-22 01:05:00 +00001720void
Brian Paulb1394fa2000-09-26 20:53:53 +00001721_mesa_destroy_context( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001722{
1723 if (ctx) {
Brian Paulb1394fa2000-09-26 20:53:53 +00001724 _mesa_free_context_data(ctx);
Brian Paulbd5cdaf1999-10-13 18:42:49 +00001725 FREE( (void *) ctx );
jtgafb833d1999-08-19 00:55:39 +00001726 }
1727}
1728
1729
1730
1731/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001732 * Called by the driver after both the context and driver are fully
1733 * initialized. Currently just reads the config file.
jtgafb833d1999-08-19 00:55:39 +00001734 */
Brian Paul178a1c52000-04-22 01:05:00 +00001735void
Brian Paulb1394fa2000-09-26 20:53:53 +00001736_mesa_context_initialize( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001737{
Brian Paul00037781999-12-17 14:52:35 +00001738 gl_read_config_file( ctx );
jtgafb833d1999-08-19 00:55:39 +00001739}
1740
1741
1742
1743/*
1744 * Copy attribute groups from one context to another.
1745 * Input: src - source context
1746 * dst - destination context
1747 * mask - bitwise OR of GL_*_BIT flags
1748 */
Brian Paul178a1c52000-04-22 01:05:00 +00001749void
Brian Paulb1394fa2000-09-26 20:53:53 +00001750_mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
jtgafb833d1999-08-19 00:55:39 +00001751{
1752 if (mask & GL_ACCUM_BUFFER_BIT) {
1753 MEMCPY( &dst->Accum, &src->Accum, sizeof(struct gl_accum_attrib) );
1754 }
1755 if (mask & GL_COLOR_BUFFER_BIT) {
1756 MEMCPY( &dst->Color, &src->Color, sizeof(struct gl_colorbuffer_attrib) );
1757 }
1758 if (mask & GL_CURRENT_BIT) {
1759 MEMCPY( &dst->Current, &src->Current, sizeof(struct gl_current_attrib) );
1760 }
1761 if (mask & GL_DEPTH_BUFFER_BIT) {
1762 MEMCPY( &dst->Depth, &src->Depth, sizeof(struct gl_depthbuffer_attrib) );
1763 }
1764 if (mask & GL_ENABLE_BIT) {
1765 /* no op */
1766 }
1767 if (mask & GL_EVAL_BIT) {
1768 MEMCPY( &dst->Eval, &src->Eval, sizeof(struct gl_eval_attrib) );
1769 }
1770 if (mask & GL_FOG_BIT) {
1771 MEMCPY( &dst->Fog, &src->Fog, sizeof(struct gl_fog_attrib) );
1772 }
1773 if (mask & GL_HINT_BIT) {
1774 MEMCPY( &dst->Hint, &src->Hint, sizeof(struct gl_hint_attrib) );
1775 }
1776 if (mask & GL_LIGHTING_BIT) {
1777 MEMCPY( &dst->Light, &src->Light, sizeof(struct gl_light_attrib) );
Brian Paul00037781999-12-17 14:52:35 +00001778 /* gl_reinit_light_attrib( &dst->Light ); */
jtgafb833d1999-08-19 00:55:39 +00001779 }
1780 if (mask & GL_LINE_BIT) {
1781 MEMCPY( &dst->Line, &src->Line, sizeof(struct gl_line_attrib) );
1782 }
1783 if (mask & GL_LIST_BIT) {
1784 MEMCPY( &dst->List, &src->List, sizeof(struct gl_list_attrib) );
1785 }
1786 if (mask & GL_PIXEL_MODE_BIT) {
1787 MEMCPY( &dst->Pixel, &src->Pixel, sizeof(struct gl_pixel_attrib) );
1788 }
1789 if (mask & GL_POINT_BIT) {
1790 MEMCPY( &dst->Point, &src->Point, sizeof(struct gl_point_attrib) );
1791 }
1792 if (mask & GL_POLYGON_BIT) {
1793 MEMCPY( &dst->Polygon, &src->Polygon, sizeof(struct gl_polygon_attrib) );
1794 }
1795 if (mask & GL_POLYGON_STIPPLE_BIT) {
1796 /* Use loop instead of MEMCPY due to problem with Portland Group's
1797 * C compiler. Reported by John Stone.
1798 */
1799 int i;
1800 for (i=0;i<32;i++) {
1801 dst->PolygonStipple[i] = src->PolygonStipple[i];
1802 }
1803 }
1804 if (mask & GL_SCISSOR_BIT) {
1805 MEMCPY( &dst->Scissor, &src->Scissor, sizeof(struct gl_scissor_attrib) );
1806 }
1807 if (mask & GL_STENCIL_BUFFER_BIT) {
1808 MEMCPY( &dst->Stencil, &src->Stencil, sizeof(struct gl_stencil_attrib) );
1809 }
1810 if (mask & GL_TEXTURE_BIT) {
1811 MEMCPY( &dst->Texture, &src->Texture, sizeof(struct gl_texture_attrib) );
1812 }
1813 if (mask & GL_TRANSFORM_BIT) {
1814 MEMCPY( &dst->Transform, &src->Transform, sizeof(struct gl_transform_attrib) );
1815 }
1816 if (mask & GL_VIEWPORT_BIT) {
1817 MEMCPY( &dst->Viewport, &src->Viewport, sizeof(struct gl_viewport_attrib) );
1818 }
1819}
1820
1821
jtgafb833d1999-08-19 00:55:39 +00001822/*
Brian Paul00037781999-12-17 14:52:35 +00001823 * Set the current context, binding the given frame buffer to the context.
1824 */
Brian Paulb1394fa2000-09-26 20:53:53 +00001825void
1826_mesa_make_current( GLcontext *newCtx, GLframebuffer *buffer )
Brian Paul00037781999-12-17 14:52:35 +00001827{
Brian Paulb1394fa2000-09-26 20:53:53 +00001828 _mesa_make_current2( newCtx, buffer, buffer );
Brian Paul00037781999-12-17 14:52:35 +00001829}
1830
1831
1832/*
1833 * Bind the given context to the given draw-buffer and read-buffer
1834 * and make it the current context for this thread.
1835 */
Brian Paulb1394fa2000-09-26 20:53:53 +00001836void
1837_mesa_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
1838 GLframebuffer *readBuffer )
Brian Paul00037781999-12-17 14:52:35 +00001839{
1840#if 0
Brian Paulf9b97d92000-01-28 20:17:42 +00001841 GLcontext *oldCtx = gl_get_context();
Brian Paul00037781999-12-17 14:52:35 +00001842
1843 /* Flush the old context
1844 */
1845 if (oldCtx) {
Brian Paulb1394fa2000-09-26 20:53:53 +00001846 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(oldCtx, "_mesa_make_current");
Brian Paul00037781999-12-17 14:52:35 +00001847
1848 /* unbind frame buffers from context */
1849 if (oldCtx->DrawBuffer) {
1850 oldCtx->DrawBuffer = NULL;
1851 }
1852 if (oldCtx->ReadBuffer) {
1853 oldCtx->ReadBuffer = NULL;
1854 }
1855 }
1856#endif
1857
1858 /* We call this function periodically (just here for now) in
1859 * order to detect when multithreading has begun.
1860 */
1861 _glapi_check_multithread();
1862
Brian Paulf9b97d92000-01-28 20:17:42 +00001863 _glapi_set_context((void *) newCtx);
Brian Paulb1394fa2000-09-26 20:53:53 +00001864 ASSERT(_mesa_get_current_context() == newCtx);
Brian Paul00037781999-12-17 14:52:35 +00001865 if (newCtx) {
1866 SET_IMMEDIATE(newCtx, newCtx->input);
1867 _glapi_set_dispatch(newCtx->CurrentDispatch);
1868 }
1869 else {
1870 _glapi_set_dispatch(NULL); /* none current */
1871 }
1872
Brian Paulb1394fa2000-09-26 20:53:53 +00001873 if (MESA_VERBOSE) fprintf(stderr, "_mesa_make_current()\n");
Brian Paul00037781999-12-17 14:52:35 +00001874
1875 if (newCtx && drawBuffer && readBuffer) {
1876 /* TODO: check if newCtx and buffer's visual match??? */
1877 newCtx->DrawBuffer = drawBuffer;
1878 newCtx->ReadBuffer = readBuffer;
1879 newCtx->NewState = NEW_ALL; /* just to be safe */
1880 gl_update_state( newCtx );
1881 }
1882
1883 /* We can use this to help debug user's problems. Tell the to set
1884 * the MESA_INFO env variable before running their app. Then the
1885 * first time each context is made current we'll print some useful
1886 * information.
1887 */
1888 if (newCtx && newCtx->FirstTimeCurrent) {
1889 if (getenv("MESA_INFO")) {
1890 fprintf(stderr, "Mesa GL_VERSION = %s\n", (char *) _mesa_GetString(GL_VERSION));
1891 fprintf(stderr, "Mesa GL_RENDERER = %s\n", (char *) _mesa_GetString(GL_RENDERER));
1892 fprintf(stderr, "Mesa GL_VENDOR = %s\n", (char *) _mesa_GetString(GL_VENDOR));
1893 fprintf(stderr, "Mesa GL_EXTENSIONS = %s\n", (char *) _mesa_GetString(GL_EXTENSIONS));
Brian Paul09cb1481999-12-17 17:00:32 +00001894#if defined(THREADS)
1895 fprintf(stderr, "Mesa thread-safe: YES\n");
1896#else
1897 fprintf(stderr, "Mesa thread-safe: NO\n");
1898#endif
Brian Paul54287052000-01-17 20:00:15 +00001899#if defined(USE_X86_ASM)
1900 fprintf(stderr, "Mesa x86-optimized: YES\n");
1901#else
1902 fprintf(stderr, "Mesa x86-optimized: NO\n");
1903#endif
Brian Paul00037781999-12-17 14:52:35 +00001904 }
1905 newCtx->FirstTimeCurrent = GL_FALSE;
1906 }
1907}
1908
1909
1910
1911/*
1912 * Return current context handle for the calling thread.
1913 * This isn't the fastest way to get the current context.
1914 * If you need speed, see the GET_CURRENT_CONTEXT() macro in context.h
1915 */
Brian Paulb1394fa2000-09-26 20:53:53 +00001916GLcontext *
1917_mesa_get_current_context( void )
Brian Paul00037781999-12-17 14:52:35 +00001918{
Brian Paulf9b97d92000-01-28 20:17:42 +00001919 return (GLcontext *) _glapi_get_context();
Brian Paul00037781999-12-17 14:52:35 +00001920}
1921
1922
1923
1924/*
Brian Paulfbd8f211999-11-11 01:22:25 +00001925 * This should be called by device drivers just before they do a
1926 * swapbuffers. Any pending rendering commands will be executed.
jtgafb833d1999-08-19 00:55:39 +00001927 */
Brian Paulfbd8f211999-11-11 01:22:25 +00001928void
1929_mesa_swapbuffers(GLcontext *ctx)
jtgafb833d1999-08-19 00:55:39 +00001930{
Brian Paulfbd8f211999-11-11 01:22:25 +00001931 FLUSH_VB( ctx, "swap buffers" );
jtgafb833d1999-08-19 00:55:39 +00001932}
1933
1934
Brian Paul00037781999-12-17 14:52:35 +00001935
Brian Paulfbd8f211999-11-11 01:22:25 +00001936/*
1937 * Return pointer to this context's current API dispatch table.
1938 * It'll either be the immediate-mode execute dispatcher or the
1939 * display list compile dispatcher.
1940 */
1941struct _glapi_table *
1942_mesa_get_dispatch(GLcontext *ctx)
1943{
1944 return ctx->CurrentDispatch;
1945}
1946
1947
1948
jtgafb833d1999-08-19 00:55:39 +00001949/**********************************************************************/
1950/***** Miscellaneous functions *****/
1951/**********************************************************************/
1952
1953
1954/*
1955 * This function is called when the Mesa user has stumbled into a code
1956 * path which may not be implemented fully or correctly.
1957 */
1958void gl_problem( const GLcontext *ctx, const char *s )
1959{
1960 fprintf( stderr, "Mesa implementation error: %s\n", s );
Brian Paul413d6a22000-05-26 14:44:59 +00001961 fprintf( stderr, "Report to Mesa bug database at www.mesa3d.org\n" );
jtgafb833d1999-08-19 00:55:39 +00001962 (void) ctx;
1963}
1964
1965
1966
1967/*
1968 * This is called to inform the user that he or she has tried to do
1969 * something illogical or if there's likely a bug in their program
1970 * (like enabled depth testing without a depth buffer).
1971 */
Brian Paulb1394fa2000-09-26 20:53:53 +00001972void
1973_mesa_warning( const GLcontext *ctx, const char *s )
jtgafb833d1999-08-19 00:55:39 +00001974{
Brian Paulb1394fa2000-09-26 20:53:53 +00001975 (*ctx->imports.warning)((__GLcontext *) ctx, (char *) s);
jtgafb833d1999-08-19 00:55:39 +00001976}
1977
1978
1979
Brian Paulfa9df402000-02-02 19:16:46 +00001980/*
1981 * Compile an error into current display list.
1982 */
Brian Paulb1394fa2000-09-26 20:53:53 +00001983void
1984_mesa_compile_error( GLcontext *ctx, GLenum error, const char *s )
jtgafb833d1999-08-19 00:55:39 +00001985{
1986 if (ctx->CompileFlag)
1987 gl_save_error( ctx, error, s );
1988
1989 if (ctx->ExecuteFlag)
1990 gl_error( ctx, error, s );
1991}
1992
1993
Brian Paulfa9df402000-02-02 19:16:46 +00001994
jtgafb833d1999-08-19 00:55:39 +00001995/*
1996 * This is Mesa's error handler. Normally, all that's done is the updating
1997 * of the current error value. If Mesa is compiled with -DDEBUG or if the
1998 * environment variable "MESA_DEBUG" is defined then a real error message
1999 * is printed to stderr.
Brian Paul7eb06032000-07-14 04:13:40 +00002000 * Input: ctx - the GL context
2001 * error - the error value
2002 * where - usually the name of function where error was detected
jtgafb833d1999-08-19 00:55:39 +00002003 */
Brian Paul7eb06032000-07-14 04:13:40 +00002004void
2005gl_error( GLcontext *ctx, GLenum error, const char *where )
jtgafb833d1999-08-19 00:55:39 +00002006{
Brian Paul7eb06032000-07-14 04:13:40 +00002007 const char *debugEnv = getenv("MESA_DEBUG");
jtgafb833d1999-08-19 00:55:39 +00002008 GLboolean debug;
2009
2010#ifdef DEBUG
Brian Paul7eb06032000-07-14 04:13:40 +00002011 if (debugEnv && strstr(debugEnv, "silent"))
jtgafb833d1999-08-19 00:55:39 +00002012 debug = GL_FALSE;
Brian Paul7eb06032000-07-14 04:13:40 +00002013 else
2014 debug = GL_TRUE;
2015#else
2016 if (debugEnv)
2017 debug = GL_TRUE;
2018 else
2019 debug = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00002020#endif
2021
2022 if (debug) {
Brian Paul7eb06032000-07-14 04:13:40 +00002023 const char *errstr;
jtgafb833d1999-08-19 00:55:39 +00002024 switch (error) {
2025 case GL_NO_ERROR:
Brian Paul7eb06032000-07-14 04:13:40 +00002026 errstr = "GL_NO_ERROR";
jtgafb833d1999-08-19 00:55:39 +00002027 break;
2028 case GL_INVALID_VALUE:
Brian Paul7eb06032000-07-14 04:13:40 +00002029 errstr = "GL_INVALID_VALUE";
jtgafb833d1999-08-19 00:55:39 +00002030 break;
2031 case GL_INVALID_ENUM:
Brian Paul7eb06032000-07-14 04:13:40 +00002032 errstr = "GL_INVALID_ENUM";
jtgafb833d1999-08-19 00:55:39 +00002033 break;
2034 case GL_INVALID_OPERATION:
Brian Paul7eb06032000-07-14 04:13:40 +00002035 errstr = "GL_INVALID_OPERATION";
jtgafb833d1999-08-19 00:55:39 +00002036 break;
2037 case GL_STACK_OVERFLOW:
Brian Paul7eb06032000-07-14 04:13:40 +00002038 errstr = "GL_STACK_OVERFLOW";
jtgafb833d1999-08-19 00:55:39 +00002039 break;
2040 case GL_STACK_UNDERFLOW:
Brian Paul7eb06032000-07-14 04:13:40 +00002041 errstr = "GL_STACK_UNDERFLOW";
jtgafb833d1999-08-19 00:55:39 +00002042 break;
2043 case GL_OUT_OF_MEMORY:
Brian Paul7eb06032000-07-14 04:13:40 +00002044 errstr = "GL_OUT_OF_MEMORY";
jtgafb833d1999-08-19 00:55:39 +00002045 break;
Brian Paul86586aa2000-06-29 18:55:52 +00002046 case GL_TABLE_TOO_LARGE:
Brian Paul7eb06032000-07-14 04:13:40 +00002047 errstr = "GL_TABLE_TOO_LARGE";
Brian Paul86586aa2000-06-29 18:55:52 +00002048 break;
jtgafb833d1999-08-19 00:55:39 +00002049 default:
Brian Paul7eb06032000-07-14 04:13:40 +00002050 errstr = "unknown";
jtgafb833d1999-08-19 00:55:39 +00002051 break;
2052 }
Brian Paul7eb06032000-07-14 04:13:40 +00002053 fprintf(stderr, "Mesa user error: %s in %s\n", errstr, where);
jtgafb833d1999-08-19 00:55:39 +00002054 }
2055
Brian Paul7eb06032000-07-14 04:13:40 +00002056 if (ctx->ErrorValue == GL_NO_ERROR) {
jtgafb833d1999-08-19 00:55:39 +00002057 ctx->ErrorValue = error;
2058 }
2059
2060 /* Call device driver's error handler, if any. This is used on the Mac. */
2061 if (ctx->Driver.Error) {
2062 (*ctx->Driver.Error)( ctx );
2063 }
2064}
2065
2066
2067
Brian Paulfa9df402000-02-02 19:16:46 +00002068void
2069_mesa_Finish( void )
jtgafb833d1999-08-19 00:55:39 +00002070{
Brian Paulfa9df402000-02-02 19:16:46 +00002071 GET_CURRENT_CONTEXT(ctx);
2072 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glFinish");
2073 if (ctx->Driver.Finish) {
2074 (*ctx->Driver.Finish)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002075 }
2076}
2077
2078
2079
Brian Paulfa9df402000-02-02 19:16:46 +00002080void
2081_mesa_Flush( void )
jtgafb833d1999-08-19 00:55:39 +00002082{
Brian Paulfa9df402000-02-02 19:16:46 +00002083 GET_CURRENT_CONTEXT(ctx);
2084 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glFlush");
2085 if (ctx->Driver.Flush) {
2086 (*ctx->Driver.Flush)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002087 }
jtgafb833d1999-08-19 00:55:39 +00002088}
Brian Paul48c6a6e2000-09-08 21:28:04 +00002089
2090
2091
2092const char *_mesa_prim_name[GL_POLYGON+2] = {
2093 "GL_POINTS",
2094 "GL_LINES",
2095 "GL_LINE_LOOP",
2096 "GL_LINE_STRIP",
2097 "GL_TRIANGLES",
2098 "GL_TRIANGLE_STRIP",
2099 "GL_TRIANGLE_FAN",
2100 "GL_QUADS",
2101 "GL_QUAD_STRIP",
2102 "GL_POLYGON",
2103 "culled primitive"
2104};
2105
Brian Paul1c56fdc2000-09-17 21:56:07 +00002106
2107GLenum gl_reduce_prim[GL_POLYGON+1] = {
2108 GL_POINTS,
2109 GL_LINES,
2110 GL_LINES,
2111 GL_LINES,
2112 GL_TRIANGLES,
2113 GL_TRIANGLES,
2114 GL_TRIANGLES,
2115 GL_TRIANGLES,
2116 GL_TRIANGLES,
2117 GL_TRIANGLES,
Gareth Hughesfc2427e2000-10-23 00:16:28 +00002118};