blob: 3268f55070c6baf7d68bb3e8227b029c5fd7af45 [file] [log] [blame]
Keith Whitwella96308c2000-10-30 13:31:59 +00001/* $Id: context.c,v 1.99 2000/10/30 13:32:00 keithw 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;
Brian Paul19300532000-10-29 19:02:23 +0000698 cl->Ptr = (void *) ctx->Current.Color;
jtgafb833d1999-08-19 00:55:39 +0000699 cl->Enabled = 1;
700
Keith Whitwellfe5d67d2000-10-27 16:44:40 +0000701 cl = &ctx->Fallback.SecondaryColor;
702 cl->Size = 3;
703 cl->Type = GL_UNSIGNED_BYTE;
704 cl->Stride = 0;
705 cl->StrideB = 0;
706 cl->Ptr = (void *) ctx->Current.SecondaryColor;
707 cl->Enabled = 1;
708
709 cl = &ctx->Fallback.FogCoord;
710 cl->Size = 1;
711 cl->Type = GL_FLOAT;
712 cl->Stride = 0;
713 cl->StrideB = 0;
714 cl->Ptr = (void *) &ctx->Current.FogCoord;
715 cl->Enabled = 1;
716
jtgafb833d1999-08-19 00:55:39 +0000717 cl = &ctx->Fallback.Index;
718 cl->Size = 1;
719 cl->Type = GL_UNSIGNED_INT;
720 cl->Stride = 0;
721 cl->StrideB = 0;
722 cl->Ptr = (void *) &ctx->Current.Index;
723 cl->Enabled = 1;
724
725 for (i = 0 ; i < MAX_TEXTURE_UNITS ; i++) {
726 cl = &ctx->Fallback.TexCoord[i];
727 cl->Size = 4;
728 cl->Type = GL_FLOAT;
729 cl->Stride = 0;
730 cl->StrideB = 0;
731 cl->Ptr = (void *) ctx->Current.Texcoord[i];
732 cl->Enabled = 1;
733 }
734
735 cl = &ctx->Fallback.EdgeFlag;
736 cl->Size = 1;
737 cl->Type = GL_UNSIGNED_BYTE;
738 cl->Stride = 0;
739 cl->StrideB = 0;
740 cl->Ptr = (void *) &ctx->Current.EdgeFlag;
741 cl->Enabled = 1;
742}
743
Brian Paul4d053dd2000-01-14 04:45:47 +0000744
jtgafb833d1999-08-19 00:55:39 +0000745/* Initialize a 1-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000746static void
747init_1d_map( struct gl_1d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000748{
749 map->Order = 1;
750 map->u1 = 0.0;
751 map->u2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000752 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000753 if (map->Points) {
754 GLint i;
755 for (i=0;i<n;i++)
756 map->Points[i] = initial[i];
757 }
jtgafb833d1999-08-19 00:55:39 +0000758}
759
760
761/* Initialize a 2-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000762static void
763init_2d_map( struct gl_2d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000764{
765 map->Uorder = 1;
766 map->Vorder = 1;
767 map->u1 = 0.0;
768 map->u2 = 1.0;
769 map->v1 = 0.0;
770 map->v2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000771 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000772 if (map->Points) {
773 GLint i;
774 for (i=0;i<n;i++)
775 map->Points[i] = initial[i];
776 }
jtgafb833d1999-08-19 00:55:39 +0000777}
778
779
jtgafb833d1999-08-19 00:55:39 +0000780/*
Brian Paul4d053dd2000-01-14 04:45:47 +0000781 * Initialize the attribute groups in a GLcontext.
jtgafb833d1999-08-19 00:55:39 +0000782 */
Brian Paul178a1c52000-04-22 01:05:00 +0000783static void
784init_attrib_groups( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000785{
786 GLuint i, j;
787
Brian Paul4d053dd2000-01-14 04:45:47 +0000788 assert(ctx);
jtgafb833d1999-08-19 00:55:39 +0000789
Brian Paul539cce52000-02-03 19:40:07 +0000790 /* Constants, may be overriden by device drivers */
Brian Paul4d053dd2000-01-14 04:45:47 +0000791 ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
792 ctx->Const.MaxTextureSize = 1 << (MAX_TEXTURE_LEVELS - 1);
Brian Paul86fc3702000-05-22 16:33:20 +0000793 ctx->Const.MaxCubeTextureSize = ctx->Const.MaxTextureSize;
Brian Paul4d053dd2000-01-14 04:45:47 +0000794 ctx->Const.MaxTextureUnits = MAX_TEXTURE_UNITS;
795 ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
Brian Paul539cce52000-02-03 19:40:07 +0000796 ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
797 ctx->Const.MinPointSize = MIN_POINT_SIZE;
798 ctx->Const.MaxPointSize = MAX_POINT_SIZE;
799 ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
800 ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
801 ctx->Const.PointSizeGranularity = POINT_SIZE_GRANULARITY;
802 ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
803 ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
804 ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
805 ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
806 ctx->Const.LineWidthGranularity = LINE_WIDTH_GRANULARITY;
807 ctx->Const.NumAuxBuffers = NUM_AUX_BUFFERS;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000808 ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
Brian Paul82b02f02000-05-07 20:37:40 +0000809 ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
810 ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
Brian Paul1207bf02000-05-23 20:10:49 +0000811 ctx->Const.NumCompressedTextureFormats = 0;
jtgafb833d1999-08-19 00:55:39 +0000812
Brian Paul4d053dd2000-01-14 04:45:47 +0000813 /* Modelview matrix */
814 gl_matrix_ctr( &ctx->ModelView );
815 gl_matrix_alloc_inv( &ctx->ModelView );
816
817 ctx->ModelViewStackDepth = 0;
Brian Paul7fc29c52000-03-06 17:03:03 +0000818 for (i = 0; i < MAX_MODELVIEW_STACK_DEPTH - 1; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000819 gl_matrix_ctr( &ctx->ModelViewStack[i] );
820 gl_matrix_alloc_inv( &ctx->ModelViewStack[i] );
821 }
822
823 /* Projection matrix - need inv for user clipping in clip space*/
824 gl_matrix_ctr( &ctx->ProjectionMatrix );
825 gl_matrix_alloc_inv( &ctx->ProjectionMatrix );
826
827 gl_matrix_ctr( &ctx->ModelProjectMatrix );
Brian Paul4d053dd2000-01-14 04:45:47 +0000828
829 ctx->ProjectionStackDepth = 0;
830 ctx->NearFarStack[0][0] = 1.0; /* These values seem weird by make */
831 ctx->NearFarStack[0][1] = 0.0; /* sense mathematically. */
832
Brian Paul7fc29c52000-03-06 17:03:03 +0000833 for (i = 0; i < MAX_PROJECTION_STACK_DEPTH - 1; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000834 gl_matrix_ctr( &ctx->ProjectionStack[i] );
835 gl_matrix_alloc_inv( &ctx->ProjectionStack[i] );
836 }
837
838 /* Texture matrix */
Brian Paul904ecb22000-06-27 23:38:45 +0000839 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000840 gl_matrix_ctr( &ctx->TextureMatrix[i] );
841 ctx->TextureStackDepth[i] = 0;
Brian Paul7fc29c52000-03-06 17:03:03 +0000842 for (j = 0; j < MAX_TEXTURE_STACK_DEPTH - 1; j++) {
Brian Paul904ecb22000-06-27 23:38:45 +0000843 gl_matrix_ctr( &ctx->TextureStack[i][j] );
Brian Paul4d053dd2000-01-14 04:45:47 +0000844 ctx->TextureStack[i][j].inv = 0;
jtgafb833d1999-08-19 00:55:39 +0000845 }
Brian Paul4d053dd2000-01-14 04:45:47 +0000846 }
jtgafb833d1999-08-19 00:55:39 +0000847
Brian Paul250069d2000-04-08 18:57:45 +0000848 /* Color matrix */
849 gl_matrix_ctr(&ctx->ColorMatrix);
850 ctx->ColorStackDepth = 0;
851 for (j = 0; j < MAX_COLOR_STACK_DEPTH - 1; j++) {
852 gl_matrix_ctr(&ctx->ColorStack[j]);
853 }
854
Brian Paul4d053dd2000-01-14 04:45:47 +0000855 /* Accumulate buffer group */
856 ASSIGN_4V( ctx->Accum.ClearColor, 0.0, 0.0, 0.0, 0.0 );
jtgafb833d1999-08-19 00:55:39 +0000857
Brian Paul4d053dd2000-01-14 04:45:47 +0000858 /* Color buffer group */
859 ctx->Color.IndexMask = 0xffffffff;
860 ctx->Color.ColorMask[0] = 0xff;
861 ctx->Color.ColorMask[1] = 0xff;
862 ctx->Color.ColorMask[2] = 0xff;
863 ctx->Color.ColorMask[3] = 0xff;
Brian Paul4d053dd2000-01-14 04:45:47 +0000864 ctx->Color.ClearIndex = 0;
865 ASSIGN_4V( ctx->Color.ClearColor, 0.0, 0.0, 0.0, 0.0 );
866 ctx->Color.DrawBuffer = GL_FRONT;
867 ctx->Color.AlphaEnabled = GL_FALSE;
868 ctx->Color.AlphaFunc = GL_ALWAYS;
869 ctx->Color.AlphaRef = 0;
870 ctx->Color.BlendEnabled = GL_FALSE;
871 ctx->Color.BlendSrcRGB = GL_ONE;
872 ctx->Color.BlendDstRGB = GL_ZERO;
873 ctx->Color.BlendSrcA = GL_ONE;
874 ctx->Color.BlendDstA = GL_ZERO;
875 ctx->Color.BlendEquation = GL_FUNC_ADD_EXT;
876 ctx->Color.BlendFunc = NULL; /* this pointer set only when needed */
877 ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 );
878 ctx->Color.IndexLogicOpEnabled = GL_FALSE;
879 ctx->Color.ColorLogicOpEnabled = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000880 ctx->Color.LogicOp = GL_COPY;
881 ctx->Color.DitherFlag = GL_TRUE;
882 ctx->Color.MultiDrawBuffer = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000883
Brian Paul4d053dd2000-01-14 04:45:47 +0000884 /* Current group */
Brian Paul19300532000-10-29 19:02:23 +0000885 ASSIGN_4V( ctx->Current.Color, CHAN_MAX, CHAN_MAX, CHAN_MAX, CHAN_MAX );
Brian Paul4d053dd2000-01-14 04:45:47 +0000886 ctx->Current.Index = 1;
887 for (i=0; i<MAX_TEXTURE_UNITS; i++)
888 ASSIGN_4V( ctx->Current.Texcoord[i], 0.0, 0.0, 0.0, 1.0 );
889 ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
890 ctx->Current.RasterDistance = 0.0;
891 ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
892 ctx->Current.RasterIndex = 1;
893 for (i=0; i<MAX_TEXTURE_UNITS; i++)
894 ASSIGN_4V( ctx->Current.RasterMultiTexCoord[i], 0.0, 0.0, 0.0, 1.0 );
895 ctx->Current.RasterTexCoord = ctx->Current.RasterMultiTexCoord[0];
896 ctx->Current.RasterPosValid = GL_TRUE;
897 ctx->Current.EdgeFlag = GL_TRUE;
898 ASSIGN_3V( ctx->Current.Normal, 0.0, 0.0, 1.0 );
899 ctx->Current.Primitive = (GLenum) (GL_POLYGON + 1);
jtgafb833d1999-08-19 00:55:39 +0000900
Brian Pauld4757302000-10-20 19:54:49 +0000901 ctx->Current.Flag = (VERT_NORM |
Gareth Hughesfc2427e2000-10-23 00:16:28 +0000902 VERT_INDEX |
Brian Pauld4757302000-10-20 19:54:49 +0000903 VERT_RGBA |
Keith Whitwellfe5d67d2000-10-27 16:44:40 +0000904 VERT_SPEC_RGB |
905 VERT_FOG_COORD |
Brian Pauld4757302000-10-20 19:54:49 +0000906 VERT_EDGE |
907 VERT_TEX0_1 |
908 VERT_TEX1_1 |
909 VERT_TEX2_1 | /* XXX fix for MAX_TEXTURE_UNITS > 3 */
910 VERT_MATERIAL);
jtgafb833d1999-08-19 00:55:39 +0000911
Brian Paul4d053dd2000-01-14 04:45:47 +0000912 init_fallback_arrays( ctx );
jtgafb833d1999-08-19 00:55:39 +0000913
Brian Paul4d053dd2000-01-14 04:45:47 +0000914 /* Depth buffer group */
915 ctx->Depth.Test = GL_FALSE;
916 ctx->Depth.Clear = 1.0;
917 ctx->Depth.Func = GL_LESS;
918 ctx->Depth.Mask = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +0000919 ctx->Depth.OcclusionTest = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000920
Brian Paul4d053dd2000-01-14 04:45:47 +0000921 /* Evaluators group */
922 ctx->Eval.Map1Color4 = GL_FALSE;
923 ctx->Eval.Map1Index = GL_FALSE;
924 ctx->Eval.Map1Normal = GL_FALSE;
925 ctx->Eval.Map1TextureCoord1 = GL_FALSE;
926 ctx->Eval.Map1TextureCoord2 = GL_FALSE;
927 ctx->Eval.Map1TextureCoord3 = GL_FALSE;
928 ctx->Eval.Map1TextureCoord4 = GL_FALSE;
929 ctx->Eval.Map1Vertex3 = GL_FALSE;
930 ctx->Eval.Map1Vertex4 = GL_FALSE;
931 ctx->Eval.Map2Color4 = GL_FALSE;
932 ctx->Eval.Map2Index = GL_FALSE;
933 ctx->Eval.Map2Normal = GL_FALSE;
934 ctx->Eval.Map2TextureCoord1 = GL_FALSE;
935 ctx->Eval.Map2TextureCoord2 = GL_FALSE;
936 ctx->Eval.Map2TextureCoord3 = GL_FALSE;
937 ctx->Eval.Map2TextureCoord4 = GL_FALSE;
938 ctx->Eval.Map2Vertex3 = GL_FALSE;
939 ctx->Eval.Map2Vertex4 = GL_FALSE;
940 ctx->Eval.AutoNormal = GL_FALSE;
941 ctx->Eval.MapGrid1un = 1;
942 ctx->Eval.MapGrid1u1 = 0.0;
943 ctx->Eval.MapGrid1u2 = 1.0;
944 ctx->Eval.MapGrid2un = 1;
945 ctx->Eval.MapGrid2vn = 1;
946 ctx->Eval.MapGrid2u1 = 0.0;
947 ctx->Eval.MapGrid2u2 = 1.0;
948 ctx->Eval.MapGrid2v1 = 0.0;
949 ctx->Eval.MapGrid2v2 = 1.0;
jtgafb833d1999-08-19 00:55:39 +0000950
Brian Paul4d053dd2000-01-14 04:45:47 +0000951 /* Evaluator data */
952 {
953 static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
954 static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
955 static GLfloat index[1] = { 1.0 };
956 static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
957 static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
jtgafb833d1999-08-19 00:55:39 +0000958
Brian Paul4d053dd2000-01-14 04:45:47 +0000959 init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
960 init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
961 init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
962 init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
963 init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
964 init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
965 init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
966 init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
967 init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
jtgafb833d1999-08-19 00:55:39 +0000968
Brian Paul4d053dd2000-01-14 04:45:47 +0000969 init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
970 init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
971 init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
972 init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
973 init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
974 init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
975 init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
976 init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
977 init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
978 }
jtgafb833d1999-08-19 00:55:39 +0000979
Brian Paul4d053dd2000-01-14 04:45:47 +0000980 /* Fog group */
981 ctx->Fog.Enabled = GL_FALSE;
982 ctx->Fog.Mode = GL_EXP;
983 ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
984 ctx->Fog.Index = 0.0;
985 ctx->Fog.Density = 1.0;
986 ctx->Fog.Start = 0.0;
987 ctx->Fog.End = 1.0;
Keith Whitwellfe5d67d2000-10-27 16:44:40 +0000988 ctx->Fog.ColorSumEnabled = GL_FALSE;
989 ctx->Fog.FogCoordinateSource = GL_FRAGMENT_DEPTH_EXT;
jtgafb833d1999-08-19 00:55:39 +0000990
Brian Paul4d053dd2000-01-14 04:45:47 +0000991 /* Hint group */
992 ctx->Hint.PerspectiveCorrection = GL_DONT_CARE;
993 ctx->Hint.PointSmooth = GL_DONT_CARE;
994 ctx->Hint.LineSmooth = GL_DONT_CARE;
995 ctx->Hint.PolygonSmooth = GL_DONT_CARE;
996 ctx->Hint.Fog = GL_DONT_CARE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000997 ctx->Hint.AllowDrawWin = GL_TRUE;
Brian Paul8cce3142000-04-10 15:52:25 +0000998 ctx->Hint.AllowDrawFrg = GL_TRUE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000999 ctx->Hint.AllowDrawMem = GL_TRUE;
1000 ctx->Hint.StrictLighting = GL_TRUE;
Brian Paul1207bf02000-05-23 20:10:49 +00001001 ctx->Hint.ClipVolumeClipping = GL_DONT_CARE;
1002 ctx->Hint.TextureCompression = GL_DONT_CARE;
jtgafb833d1999-08-19 00:55:39 +00001003
Brian Paul0771d152000-04-07 00:19:41 +00001004 /* Histogram group */
1005 ctx->Histogram.Width = 0;
1006 ctx->Histogram.Format = GL_RGBA;
1007 ctx->Histogram.Sink = GL_FALSE;
1008 ctx->Histogram.RedSize = 0xffffffff;
1009 ctx->Histogram.GreenSize = 0xffffffff;
1010 ctx->Histogram.BlueSize = 0xffffffff;
1011 ctx->Histogram.AlphaSize = 0xffffffff;
1012 ctx->Histogram.LuminanceSize = 0xffffffff;
1013 for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
1014 ctx->Histogram.Count[i][0] = 0;
1015 ctx->Histogram.Count[i][1] = 0;
1016 ctx->Histogram.Count[i][2] = 0;
1017 ctx->Histogram.Count[i][3] = 0;
1018 }
1019
1020 /* Min/Max group */
1021 ctx->MinMax.Format = GL_RGBA;
1022 ctx->MinMax.Sink = GL_FALSE;
1023 ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000;
1024 ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000;
1025 ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000;
1026 ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000;
1027
Brian Paul4d053dd2000-01-14 04:45:47 +00001028 /* Pipeline */
1029 gl_pipeline_init( ctx );
1030 gl_cva_init( ctx );
jtgafb833d1999-08-19 00:55:39 +00001031
Brian Paul4d053dd2000-01-14 04:45:47 +00001032 /* Extensions */
1033 gl_extensions_ctr( ctx );
jtgafb833d1999-08-19 00:55:39 +00001034
Brian Paul4d053dd2000-01-14 04:45:47 +00001035 ctx->AllowVertexCull = CLIP_CULLED_BIT;
jtgafb833d1999-08-19 00:55:39 +00001036
Brian Paul4d053dd2000-01-14 04:45:47 +00001037 /* Lighting group */
1038 for (i=0;i<MAX_LIGHTS;i++) {
1039 init_light( &ctx->Light.Light[i], i );
1040 }
1041 make_empty_list( &ctx->Light.EnabledList );
jtgafb833d1999-08-19 00:55:39 +00001042
Brian Paul4d053dd2000-01-14 04:45:47 +00001043 init_lightmodel( &ctx->Light.Model );
1044 init_material( &ctx->Light.Material[0] );
1045 init_material( &ctx->Light.Material[1] );
1046 ctx->Light.ShadeModel = GL_SMOOTH;
1047 ctx->Light.Enabled = GL_FALSE;
1048 ctx->Light.ColorMaterialFace = GL_FRONT_AND_BACK;
1049 ctx->Light.ColorMaterialMode = GL_AMBIENT_AND_DIFFUSE;
1050 ctx->Light.ColorMaterialBitmask
1051 = gl_material_bitmask( ctx,
1052 GL_FRONT_AND_BACK,
1053 GL_AMBIENT_AND_DIFFUSE, ~0, 0 );
jtgafb833d1999-08-19 00:55:39 +00001054
Brian Paul4d053dd2000-01-14 04:45:47 +00001055 ctx->Light.ColorMaterialEnabled = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001056
Brian Paul4d053dd2000-01-14 04:45:47 +00001057 /* Lighting miscellaneous */
1058 ctx->ShineTabList = MALLOC_STRUCT( gl_shine_tab );
1059 make_empty_list( ctx->ShineTabList );
1060 for (i = 0 ; i < 10 ; i++) {
1061 struct gl_shine_tab *s = MALLOC_STRUCT( gl_shine_tab );
1062 s->shininess = -1;
1063 s->refcount = 0;
1064 insert_at_tail( ctx->ShineTabList, s );
1065 }
1066 for (i = 0 ; i < 4 ; i++) {
1067 ctx->ShineTable[i] = ctx->ShineTabList->prev;
1068 ctx->ShineTable[i]->refcount++;
1069 }
jtgafb833d1999-08-19 00:55:39 +00001070
Brian Paul77d61af2000-06-28 04:20:21 +00001071 gl_compute_shine_table( ctx, 0, ctx->Light.Material[0].Shininess );
1072 gl_compute_shine_table( ctx, 2, ctx->Light.Material[0].Shininess * .5 );
1073 gl_compute_shine_table( ctx, 1, ctx->Light.Material[1].Shininess );
1074 gl_compute_shine_table( ctx, 3, ctx->Light.Material[1].Shininess * .5 );
1075
jtgafb833d1999-08-19 00:55:39 +00001076
Brian Paul4d053dd2000-01-14 04:45:47 +00001077 /* Line group */
1078 ctx->Line.SmoothFlag = GL_FALSE;
1079 ctx->Line.StippleFlag = GL_FALSE;
1080 ctx->Line.Width = 1.0;
1081 ctx->Line.StipplePattern = 0xffff;
1082 ctx->Line.StippleFactor = 1;
jtgafb833d1999-08-19 00:55:39 +00001083
Brian Paul4d053dd2000-01-14 04:45:47 +00001084 /* Display List group */
1085 ctx->List.ListBase = 0;
jtgafb833d1999-08-19 00:55:39 +00001086
Brian Paul4d053dd2000-01-14 04:45:47 +00001087 /* Pixel group */
1088 ctx->Pixel.RedBias = 0.0;
1089 ctx->Pixel.RedScale = 1.0;
1090 ctx->Pixel.GreenBias = 0.0;
1091 ctx->Pixel.GreenScale = 1.0;
1092 ctx->Pixel.BlueBias = 0.0;
1093 ctx->Pixel.BlueScale = 1.0;
1094 ctx->Pixel.AlphaBias = 0.0;
1095 ctx->Pixel.AlphaScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001096 ctx->Pixel.DepthBias = 0.0;
1097 ctx->Pixel.DepthScale = 1.0;
1098 ctx->Pixel.IndexOffset = 0;
1099 ctx->Pixel.IndexShift = 0;
1100 ctx->Pixel.ZoomX = 1.0;
1101 ctx->Pixel.ZoomY = 1.0;
1102 ctx->Pixel.MapColorFlag = GL_FALSE;
1103 ctx->Pixel.MapStencilFlag = GL_FALSE;
1104 ctx->Pixel.MapStoSsize = 1;
1105 ctx->Pixel.MapItoIsize = 1;
1106 ctx->Pixel.MapItoRsize = 1;
1107 ctx->Pixel.MapItoGsize = 1;
1108 ctx->Pixel.MapItoBsize = 1;
1109 ctx->Pixel.MapItoAsize = 1;
1110 ctx->Pixel.MapRtoRsize = 1;
1111 ctx->Pixel.MapGtoGsize = 1;
1112 ctx->Pixel.MapBtoBsize = 1;
1113 ctx->Pixel.MapAtoAsize = 1;
1114 ctx->Pixel.MapStoS[0] = 0;
1115 ctx->Pixel.MapItoI[0] = 0;
1116 ctx->Pixel.MapItoR[0] = 0.0;
1117 ctx->Pixel.MapItoG[0] = 0.0;
1118 ctx->Pixel.MapItoB[0] = 0.0;
1119 ctx->Pixel.MapItoA[0] = 0.0;
1120 ctx->Pixel.MapItoR8[0] = 0;
1121 ctx->Pixel.MapItoG8[0] = 0;
1122 ctx->Pixel.MapItoB8[0] = 0;
1123 ctx->Pixel.MapItoA8[0] = 0;
1124 ctx->Pixel.MapRtoR[0] = 0.0;
1125 ctx->Pixel.MapGtoG[0] = 0.0;
1126 ctx->Pixel.MapBtoB[0] = 0.0;
1127 ctx->Pixel.MapAtoA[0] = 0.0;
Brian Paul2b2e9252000-04-07 16:27:26 +00001128 ctx->Pixel.HistogramEnabled = GL_FALSE;
1129 ctx->Pixel.MinMaxEnabled = GL_FALSE;
1130 ctx->Pixel.PixelTextureEnabled = GL_FALSE;
1131 ctx->Pixel.FragmentRgbSource = GL_PIXEL_GROUP_COLOR_SGIS;
1132 ctx->Pixel.FragmentAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS;
Brian Paul82b02f02000-05-07 20:37:40 +00001133 ASSIGN_4V(ctx->Pixel.PostColorMatrixScale, 1.0, 1.0, 1.0, 1.0);
1134 ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0);
1135 ASSIGN_4V(ctx->Pixel.ColorTableScale, 1.0, 1.0, 1.0, 1.0);
1136 ASSIGN_4V(ctx->Pixel.ColorTableBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul6c50e162000-06-30 22:11:04 +00001137 ASSIGN_4V(ctx->Pixel.PCCTscale, 1.0, 1.0, 1.0, 1.0);
1138 ASSIGN_4V(ctx->Pixel.PCCTbias, 0.0, 0.0, 0.0, 0.0);
1139 ASSIGN_4V(ctx->Pixel.PCMCTscale, 1.0, 1.0, 1.0, 1.0);
1140 ASSIGN_4V(ctx->Pixel.PCMCTbias, 0.0, 0.0, 0.0, 0.0);
Brian Paul4fe34b22000-04-11 15:07:48 +00001141 ctx->Pixel.ColorTableEnabled = GL_FALSE;
1142 ctx->Pixel.PostConvolutionColorTableEnabled = GL_FALSE;
1143 ctx->Pixel.PostColorMatrixColorTableEnabled = GL_FALSE;
Brian Paul82b02f02000-05-07 20:37:40 +00001144 ctx->Pixel.Convolution1DEnabled = GL_FALSE;
1145 ctx->Pixel.Convolution2DEnabled = GL_FALSE;
1146 ctx->Pixel.Separable2DEnabled = GL_FALSE;
1147 for (i = 0; i < 3; i++) {
1148 ASSIGN_4V(ctx->Pixel.ConvolutionBorderColor[i], 0.0, 0.0, 0.0, 0.0);
1149 ctx->Pixel.ConvolutionBorderMode[i] = GL_REDUCE;
1150 ASSIGN_4V(ctx->Pixel.ConvolutionFilterScale[i], 1.0, 1.0, 1.0, 1.0);
1151 ASSIGN_4V(ctx->Pixel.ConvolutionFilterBias[i], 0.0, 0.0, 0.0, 0.0);
1152 }
1153 ASSIGN_4V(ctx->Pixel.PostConvolutionScale, 1.0, 1.0, 1.0, 1.0);
1154 ASSIGN_4V(ctx->Pixel.PostConvolutionBias, 0.0, 0.0, 0.0, 0.0);
jtgafb833d1999-08-19 00:55:39 +00001155
Brian Paul4d053dd2000-01-14 04:45:47 +00001156 /* Point group */
1157 ctx->Point.SmoothFlag = GL_FALSE;
Brian Paula25f7e12000-06-27 04:29:22 +00001158 ctx->Point.UserSize = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001159 ctx->Point.Size = 1.0;
1160 ctx->Point.Params[0] = 1.0;
1161 ctx->Point.Params[1] = 0.0;
1162 ctx->Point.Params[2] = 0.0;
1163 ctx->Point.Attenuated = GL_FALSE;
1164 ctx->Point.MinSize = 0.0;
1165 ctx->Point.MaxSize = (GLfloat) MAX_POINT_SIZE;
1166 ctx->Point.Threshold = 1.0;
jtgafb833d1999-08-19 00:55:39 +00001167
Brian Paul4d053dd2000-01-14 04:45:47 +00001168 /* Polygon group */
1169 ctx->Polygon.CullFlag = GL_FALSE;
1170 ctx->Polygon.CullFaceMode = GL_BACK;
1171 ctx->Polygon.FrontFace = GL_CCW;
1172 ctx->Polygon.FrontBit = 0;
1173 ctx->Polygon.FrontMode = GL_FILL;
1174 ctx->Polygon.BackMode = GL_FILL;
1175 ctx->Polygon.Unfilled = GL_FALSE;
1176 ctx->Polygon.SmoothFlag = GL_FALSE;
1177 ctx->Polygon.StippleFlag = GL_FALSE;
1178 ctx->Polygon.OffsetFactor = 0.0F;
1179 ctx->Polygon.OffsetUnits = 0.0F;
Brian Pauld0d7d622000-10-21 00:02:47 +00001180 ctx->Polygon.OffsetMRD = 0.0F;
Brian Paul4d053dd2000-01-14 04:45:47 +00001181 ctx->Polygon.OffsetPoint = GL_FALSE;
1182 ctx->Polygon.OffsetLine = GL_FALSE;
1183 ctx->Polygon.OffsetFill = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001184
Brian Paul4d053dd2000-01-14 04:45:47 +00001185 /* Polygon Stipple group */
1186 MEMSET( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) );
jtgafb833d1999-08-19 00:55:39 +00001187
Brian Paul4d053dd2000-01-14 04:45:47 +00001188 /* Scissor group */
1189 ctx->Scissor.Enabled = GL_FALSE;
1190 ctx->Scissor.X = 0;
1191 ctx->Scissor.Y = 0;
1192 ctx->Scissor.Width = 0;
1193 ctx->Scissor.Height = 0;
jtgafb833d1999-08-19 00:55:39 +00001194
Brian Paul4d053dd2000-01-14 04:45:47 +00001195 /* Stencil group */
1196 ctx->Stencil.Enabled = GL_FALSE;
1197 ctx->Stencil.Function = GL_ALWAYS;
1198 ctx->Stencil.FailFunc = GL_KEEP;
1199 ctx->Stencil.ZPassFunc = GL_KEEP;
1200 ctx->Stencil.ZFailFunc = GL_KEEP;
1201 ctx->Stencil.Ref = 0;
1202 ctx->Stencil.ValueMask = STENCIL_MAX;
1203 ctx->Stencil.Clear = 0;
1204 ctx->Stencil.WriteMask = STENCIL_MAX;
jtgafb833d1999-08-19 00:55:39 +00001205
Brian Paul4d053dd2000-01-14 04:45:47 +00001206 /* Texture group */
1207 ctx->Texture.CurrentUnit = 0; /* multitexture */
1208 ctx->Texture.CurrentTransformUnit = 0; /* multitexture */
Brian Paul23316032000-09-14 23:13:23 +00001209 ctx->Texture.ReallyEnabled = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001210 for (i=0; i<MAX_TEXTURE_UNITS; i++)
1211 init_texture_unit( ctx, i );
Brian Paul23316032000-09-14 23:13:23 +00001212 ctx->Texture.SharedPalette = GL_FALSE;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001213 _mesa_init_colortable(&ctx->Texture.Palette);
jtgafb833d1999-08-19 00:55:39 +00001214
Brian Paul4d053dd2000-01-14 04:45:47 +00001215 /* Transformation group */
1216 ctx->Transform.MatrixMode = GL_MODELVIEW;
1217 ctx->Transform.Normalize = GL_FALSE;
1218 ctx->Transform.RescaleNormals = GL_FALSE;
1219 for (i=0;i<MAX_CLIP_PLANES;i++) {
1220 ctx->Transform.ClipEnabled[i] = GL_FALSE;
1221 ASSIGN_4V( ctx->Transform.EyeUserPlane[i], 0.0, 0.0, 0.0, 0.0 );
1222 }
1223 ctx->Transform.AnyClip = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001224
Brian Paul4d053dd2000-01-14 04:45:47 +00001225 /* Viewport group */
1226 ctx->Viewport.X = 0;
1227 ctx->Viewport.Y = 0;
1228 ctx->Viewport.Width = 0;
1229 ctx->Viewport.Height = 0;
1230 ctx->Viewport.Near = 0.0;
1231 ctx->Viewport.Far = 1.0;
1232 gl_matrix_ctr(&ctx->Viewport.WindowMap);
jtgafb833d1999-08-19 00:55:39 +00001233
1234#define Sz 10
1235#define Tz 14
Brian Paulb1394fa2000-09-26 20:53:53 +00001236 ctx->Viewport.WindowMap.m[Sz] = 0.5 * ctx->Visual.DepthMaxF;
1237 ctx->Viewport.WindowMap.m[Tz] = 0.5 * ctx->Visual.DepthMaxF;
jtgafb833d1999-08-19 00:55:39 +00001238#undef Sz
1239#undef Tz
1240
Brian Paul4d053dd2000-01-14 04:45:47 +00001241 ctx->Viewport.WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION;
1242 ctx->Viewport.WindowMap.type = MATRIX_3D_NO_ROT;
jtgafb833d1999-08-19 00:55:39 +00001243
Brian Paul4d053dd2000-01-14 04:45:47 +00001244 /* Vertex arrays */
1245 ctx->Array.Vertex.Size = 4;
1246 ctx->Array.Vertex.Type = GL_FLOAT;
1247 ctx->Array.Vertex.Stride = 0;
1248 ctx->Array.Vertex.StrideB = 0;
1249 ctx->Array.Vertex.Ptr = NULL;
1250 ctx->Array.Vertex.Enabled = GL_FALSE;
1251 ctx->Array.Normal.Type = GL_FLOAT;
1252 ctx->Array.Normal.Stride = 0;
1253 ctx->Array.Normal.StrideB = 0;
1254 ctx->Array.Normal.Ptr = NULL;
1255 ctx->Array.Normal.Enabled = GL_FALSE;
1256 ctx->Array.Color.Size = 4;
1257 ctx->Array.Color.Type = GL_FLOAT;
1258 ctx->Array.Color.Stride = 0;
1259 ctx->Array.Color.StrideB = 0;
1260 ctx->Array.Color.Ptr = NULL;
1261 ctx->Array.Color.Enabled = GL_FALSE;
1262 ctx->Array.Index.Type = GL_FLOAT;
1263 ctx->Array.Index.Stride = 0;
1264 ctx->Array.Index.StrideB = 0;
1265 ctx->Array.Index.Ptr = NULL;
1266 ctx->Array.Index.Enabled = GL_FALSE;
1267 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
1268 ctx->Array.TexCoord[i].Size = 4;
1269 ctx->Array.TexCoord[i].Type = GL_FLOAT;
1270 ctx->Array.TexCoord[i].Stride = 0;
1271 ctx->Array.TexCoord[i].StrideB = 0;
1272 ctx->Array.TexCoord[i].Ptr = NULL;
1273 ctx->Array.TexCoord[i].Enabled = GL_FALSE;
1274 }
1275 ctx->Array.TexCoordInterleaveFactor = 1;
1276 ctx->Array.EdgeFlag.Stride = 0;
1277 ctx->Array.EdgeFlag.StrideB = 0;
1278 ctx->Array.EdgeFlag.Ptr = NULL;
1279 ctx->Array.EdgeFlag.Enabled = GL_FALSE;
1280 ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */
1281
1282 /* Pixel transfer */
1283 ctx->Pack.Alignment = 4;
1284 ctx->Pack.RowLength = 0;
1285 ctx->Pack.ImageHeight = 0;
1286 ctx->Pack.SkipPixels = 0;
1287 ctx->Pack.SkipRows = 0;
1288 ctx->Pack.SkipImages = 0;
1289 ctx->Pack.SwapBytes = GL_FALSE;
1290 ctx->Pack.LsbFirst = GL_FALSE;
1291 ctx->Unpack.Alignment = 4;
1292 ctx->Unpack.RowLength = 0;
1293 ctx->Unpack.ImageHeight = 0;
1294 ctx->Unpack.SkipPixels = 0;
1295 ctx->Unpack.SkipRows = 0;
1296 ctx->Unpack.SkipImages = 0;
1297 ctx->Unpack.SwapBytes = GL_FALSE;
1298 ctx->Unpack.LsbFirst = GL_FALSE;
1299
1300 /* Feedback */
1301 ctx->Feedback.Type = GL_2D; /* TODO: verify */
1302 ctx->Feedback.Buffer = NULL;
1303 ctx->Feedback.BufferSize = 0;
1304 ctx->Feedback.Count = 0;
1305
1306 /* Selection/picking */
1307 ctx->Select.Buffer = NULL;
1308 ctx->Select.BufferSize = 0;
1309 ctx->Select.BufferCount = 0;
1310 ctx->Select.Hits = 0;
1311 ctx->Select.NameStackDepth = 0;
1312
1313 /* Optimized Accum buffer */
1314 ctx->IntegerAccumMode = GL_TRUE;
1315 ctx->IntegerAccumScaler = 0.0;
1316
1317 /* Renderer and client attribute stacks */
1318 ctx->AttribStackDepth = 0;
1319 ctx->ClientAttribStackDepth = 0;
1320
Brian Paul13811372000-04-12 00:27:37 +00001321 /* Display list */
1322 ctx->CallDepth = 0;
1323 ctx->ExecuteFlag = GL_TRUE;
1324 ctx->CompileFlag = GL_FALSE;
1325 ctx->CurrentListPtr = NULL;
1326 ctx->CurrentBlock = NULL;
1327 ctx->CurrentListNum = 0;
1328 ctx->CurrentPos = 0;
1329
1330 /* Color tables */
Brian Paul4bdcfe52000-04-17 17:57:04 +00001331 _mesa_init_colortable(&ctx->ColorTable);
1332 _mesa_init_colortable(&ctx->ProxyColorTable);
1333 _mesa_init_colortable(&ctx->PostConvolutionColorTable);
1334 _mesa_init_colortable(&ctx->ProxyPostConvolutionColorTable);
1335 _mesa_init_colortable(&ctx->PostColorMatrixColorTable);
1336 _mesa_init_colortable(&ctx->ProxyPostColorMatrixColorTable);
Brian Paul13811372000-04-12 00:27:37 +00001337
Brian Paul4d053dd2000-01-14 04:45:47 +00001338 /* Miscellaneous */
Keith Whitwella96308c2000-10-30 13:31:59 +00001339 ctx->NewState = _NEW_ALL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001340 ctx->RenderMode = GL_RENDER;
1341 ctx->StippleCounter = 0;
1342 ctx->NeedNormals = GL_FALSE;
1343 ctx->DoViewportMapping = GL_TRUE;
Brian Paulfa4525e2000-08-21 14:22:24 +00001344 ctx->ImageTransferState = UPDATE_IMAGE_TRANSFER_STATE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001345
1346 ctx->NeedEyeCoords = GL_FALSE;
1347 ctx->NeedEyeNormals = GL_FALSE;
1348 ctx->vb_proj_matrix = &ctx->ModelProjectMatrix;
1349
Brian Paul4d053dd2000-01-14 04:45:47 +00001350 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
1351
1352 ctx->CatchSignals = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001353 ctx->OcclusionResult = GL_FALSE;
Brian Paul7e67fb42000-04-04 15:14:10 +00001354 ctx->OcclusionResultSaved = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001355
1356 /* For debug/development only */
1357 ctx->NoRaster = getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
1358 ctx->FirstTimeCurrent = GL_TRUE;
1359
1360 /* Dither disable */
1361 ctx->NoDither = getenv("MESA_NO_DITHER") ? GL_TRUE : GL_FALSE;
1362 if (ctx->NoDither) {
1363 if (getenv("MESA_DEBUG")) {
1364 fprintf(stderr, "MESA_NO_DITHER set - dithering disabled\n");
jtgafb833d1999-08-19 00:55:39 +00001365 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001366 ctx->Color.DitherFlag = GL_FALSE;
Brian Paul00037781999-12-17 14:52:35 +00001367 }
1368}
1369
1370
1371
1372
jtgafb833d1999-08-19 00:55:39 +00001373/*
1374 * Allocate the proxy textures. If we run out of memory part way through
1375 * the allocations clean up and return GL_FALSE.
1376 * Return: GL_TRUE=success, GL_FALSE=failure
1377 */
Brian Paul178a1c52000-04-22 01:05:00 +00001378static GLboolean
1379alloc_proxy_textures( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001380{
1381 GLboolean out_of_memory;
1382 GLint i;
1383
1384 ctx->Texture.Proxy1D = gl_alloc_texture_object(NULL, 0, 1);
1385 if (!ctx->Texture.Proxy1D) {
1386 return GL_FALSE;
1387 }
1388
1389 ctx->Texture.Proxy2D = gl_alloc_texture_object(NULL, 0, 2);
1390 if (!ctx->Texture.Proxy2D) {
1391 gl_free_texture_object(NULL, ctx->Texture.Proxy1D);
1392 return GL_FALSE;
1393 }
1394
1395 ctx->Texture.Proxy3D = gl_alloc_texture_object(NULL, 0, 3);
1396 if (!ctx->Texture.Proxy3D) {
1397 gl_free_texture_object(NULL, ctx->Texture.Proxy1D);
1398 gl_free_texture_object(NULL, ctx->Texture.Proxy2D);
1399 return GL_FALSE;
1400 }
1401
1402 out_of_memory = GL_FALSE;
1403 for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
Brian Paul021a5252000-03-27 17:54:17 +00001404 ctx->Texture.Proxy1D->Image[i] = _mesa_alloc_texture_image();
1405 ctx->Texture.Proxy2D->Image[i] = _mesa_alloc_texture_image();
1406 ctx->Texture.Proxy3D->Image[i] = _mesa_alloc_texture_image();
jtgafb833d1999-08-19 00:55:39 +00001407 if (!ctx->Texture.Proxy1D->Image[i]
1408 || !ctx->Texture.Proxy2D->Image[i]
1409 || !ctx->Texture.Proxy3D->Image[i]) {
1410 out_of_memory = GL_TRUE;
1411 }
1412 }
1413 if (out_of_memory) {
1414 for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
1415 if (ctx->Texture.Proxy1D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001416 _mesa_free_texture_image(ctx->Texture.Proxy1D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001417 }
1418 if (ctx->Texture.Proxy2D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001419 _mesa_free_texture_image(ctx->Texture.Proxy2D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001420 }
1421 if (ctx->Texture.Proxy3D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001422 _mesa_free_texture_image(ctx->Texture.Proxy3D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001423 }
1424 }
1425 gl_free_texture_object(NULL, ctx->Texture.Proxy1D);
1426 gl_free_texture_object(NULL, ctx->Texture.Proxy2D);
1427 gl_free_texture_object(NULL, ctx->Texture.Proxy3D);
1428 return GL_FALSE;
1429 }
1430 else {
1431 return GL_TRUE;
1432 }
1433}
1434
1435
jtgafb833d1999-08-19 00:55:39 +00001436/*
Brian Paul8aee2a32000-08-29 18:57:58 +00001437 * Initialize a GLcontext struct. This includes allocating all the
1438 * other structs and arrays which hang off of the context by pointers.
jtgafb833d1999-08-19 00:55:39 +00001439 */
Brian Paul178a1c52000-04-22 01:05:00 +00001440GLboolean
1441_mesa_initialize_context( GLcontext *ctx,
1442 GLvisual *visual,
1443 GLcontext *share_list,
1444 void *driver_ctx,
1445 GLboolean direct )
jtgafb833d1999-08-19 00:55:39 +00001446{
Brian Paul5fb84d22000-05-24 15:04:45 +00001447 GLuint dispatchSize;
1448
jtgafb833d1999-08-19 00:55:39 +00001449 (void) direct; /* not used */
1450
jtgafb833d1999-08-19 00:55:39 +00001451 /* misc one-time initializations */
1452 one_time_init();
1453
Brian Paulb1394fa2000-09-26 20:53:53 +00001454 /**
1455 ** OpenGL SI stuff
1456 **/
1457 if (!ctx->imports.malloc) {
1458 _mesa_InitDefaultImports(&ctx->imports, driver_ctx, NULL);
1459 }
1460 /* exports are setup by the device driver */
1461
jtgafb833d1999-08-19 00:55:39 +00001462 ctx->DriverCtx = driver_ctx;
Brian Paulb1394fa2000-09-26 20:53:53 +00001463 ctx->Visual = *visual;
Brian Paul3f02f901999-11-24 18:48:30 +00001464 ctx->DrawBuffer = NULL;
1465 ctx->ReadBuffer = NULL;
jtgafb833d1999-08-19 00:55:39 +00001466
1467 ctx->VB = gl_vb_create_for_immediate( ctx );
1468 if (!ctx->VB) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001469 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001470 }
1471 ctx->input = ctx->VB->IM;
1472
1473 ctx->PB = gl_alloc_pb();
1474 if (!ctx->PB) {
Brian Paul2d8db392000-06-27 22:10:00 +00001475 ALIGN_FREE( ctx->VB );
Brian Paul4d053dd2000-01-14 04:45:47 +00001476 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001477 }
1478
1479 if (share_list) {
1480 /* share the group of display lists of another context */
1481 ctx->Shared = share_list->Shared;
1482 }
1483 else {
1484 /* allocate new group of display lists */
1485 ctx->Shared = alloc_shared_state();
1486 if (!ctx->Shared) {
Brian Paul2d8db392000-06-27 22:10:00 +00001487 ALIGN_FREE( ctx->VB );
1488 FREE( ctx->PB );
Brian Paul4d053dd2000-01-14 04:45:47 +00001489 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001490 }
1491 }
Brian Paul9560f052000-01-31 23:11:39 +00001492 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001493 ctx->Shared->RefCount++;
Brian Paul9560f052000-01-31 23:11:39 +00001494 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001495
Brian Paul4d053dd2000-01-14 04:45:47 +00001496 init_attrib_groups( ctx );
1497
jtgafb833d1999-08-19 00:55:39 +00001498 gl_reset_vb( ctx->VB );
1499 gl_reset_input( ctx );
1500
jtgafb833d1999-08-19 00:55:39 +00001501 if (visual->DBflag) {
1502 ctx->Color.DrawBuffer = GL_BACK;
1503 ctx->Color.DriverDrawBuffer = GL_BACK_LEFT;
1504 ctx->Color.DrawDestMask = BACK_LEFT_BIT;
1505 ctx->Pixel.ReadBuffer = GL_BACK;
1506 ctx->Pixel.DriverReadBuffer = GL_BACK_LEFT;
1507 }
1508 else {
1509 ctx->Color.DrawBuffer = GL_FRONT;
1510 ctx->Color.DriverDrawBuffer = GL_FRONT_LEFT;
1511 ctx->Color.DrawDestMask = FRONT_LEFT_BIT;
1512 ctx->Pixel.ReadBuffer = GL_FRONT;
1513 ctx->Pixel.DriverReadBuffer = GL_FRONT_LEFT;
1514 }
1515
jtgafb833d1999-08-19 00:55:39 +00001516 if (!alloc_proxy_textures(ctx)) {
1517 free_shared_state(ctx, ctx->Shared);
Brian Paul2d8db392000-06-27 22:10:00 +00001518 ALIGN_FREE( ctx->VB );
1519 FREE( ctx->PB );
Brian Paul4d053dd2000-01-14 04:45:47 +00001520 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001521 }
jtgafb833d1999-08-19 00:55:39 +00001522
Brian Paulf59afc92000-05-23 23:23:00 +00001523 /* register the most recent extension functions with libGL */
1524 _glapi_add_entrypoint("glTbufferMask3DFX", 553);
1525 _glapi_add_entrypoint("glCompressedTexImage3DARB", 554);
1526 _glapi_add_entrypoint("glCompressedTexImage2DARB", 555);
1527 _glapi_add_entrypoint("glCompressedTexImage1DARB", 556);
1528 _glapi_add_entrypoint("glCompressedTexSubImage3DARB", 557);
1529 _glapi_add_entrypoint("glCompressedTexSubImage2DARB", 558);
1530 _glapi_add_entrypoint("glCompressedTexSubImage1DARB", 559);
1531 _glapi_add_entrypoint("glGetCompressedTexImageARB", 560);
1532
Brian Paul5fb84d22000-05-24 15:04:45 +00001533 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
1534 * In practice, this'll be the same for stand-alone Mesa. But for DRI
1535 * Mesa we do this to accomodate different versions of libGL and various
1536 * DRI drivers.
1537 */
1538 dispatchSize = MAX2(_glapi_get_dispatch_table_size(),
1539 sizeof(struct _glapi_table) / sizeof(void *));
1540
Brian Paulfbd8f211999-11-11 01:22:25 +00001541 /* setup API dispatch tables */
Brian Paul5fb84d22000-05-24 15:04:45 +00001542 ctx->Exec = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
1543 ctx->Save = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001544 if (!ctx->Exec || !ctx->Save) {
1545 free_shared_state(ctx, ctx->Shared);
Brian Paul2d8db392000-06-27 22:10:00 +00001546 ALIGN_FREE( ctx->VB );
1547 FREE( ctx->PB );
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001548 if (ctx->Exec)
Brian Paul2d8db392000-06-27 22:10:00 +00001549 FREE( ctx->Exec );
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001550 }
Brian Paul5fb84d22000-05-24 15:04:45 +00001551 _mesa_init_exec_table(ctx->Exec, dispatchSize);
1552 _mesa_init_dlist_table(ctx->Save, dispatchSize);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001553 ctx->CurrentDispatch = ctx->Exec;
jtgafb833d1999-08-19 00:55:39 +00001554
Brian Paul3b18a362000-09-26 15:27:20 +00001555#if defined(MESA_TRACE)
Brian Paul45f36342000-09-05 20:28:06 +00001556 ctx->TraceCtx = CALLOC( sizeof(trace_context_t) );
1557#if 0
1558 /* Brian: do you want to have CreateContext fail here,
1559 or should we just trap in NewTrace (currently done)? */
1560 if (!(ctx->TraceCtx)) {
1561 free_shared_state(ctx, ctx->Shared);
1562 ALIGN_FREE( ctx->VB );
1563 FREE( ctx->PB );
1564 FREE( ctx->Exec );
1565 FREE( ctx->Save );
1566 return GL_FALSE;
1567 }
1568#endif
1569 trInitContext(ctx->TraceCtx);
1570
1571 ctx->TraceDispatch = (struct _glapi_table *)
1572 CALLOC(dispatchSize * sizeof(void*));
1573#if 0
1574 if (!(ctx->TraceCtx)) {
1575 free_shared_state(ctx, ctx->Shared);
1576 ALIGN_FREE( ctx->VB );
1577 FREE( ctx->PB );
1578 FREE( ctx->Exec );
1579 FREE( ctx->Save );
1580 FREE( ctx->TraceCtx );
1581 return GL_FALSE;
1582 }
1583#endif
1584 trInitDispatch(ctx->TraceDispatch);
1585#endif
1586
Brian Paul4d053dd2000-01-14 04:45:47 +00001587 return GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001588}
1589
jtgafb833d1999-08-19 00:55:39 +00001590
1591
1592/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001593 * Allocate and initialize a GLcontext structure.
1594 * Input: visual - a GLvisual pointer
1595 * sharelist - another context to share display lists with or NULL
1596 * driver_ctx - pointer to device driver's context state struct
Brian Paulb1394fa2000-09-26 20:53:53 +00001597 * Return: pointer to a new __GLcontextRec or NULL if error.
Brian Paul4d053dd2000-01-14 04:45:47 +00001598 */
Brian Paul178a1c52000-04-22 01:05:00 +00001599GLcontext *
Brian Paulb1394fa2000-09-26 20:53:53 +00001600_mesa_create_context( GLvisual *visual,
1601 GLcontext *share_list,
1602 void *driver_ctx,
1603 GLboolean direct )
Brian Paul4d053dd2000-01-14 04:45:47 +00001604{
1605 GLcontext *ctx = (GLcontext *) CALLOC( sizeof(GLcontext) );
1606 if (!ctx) {
1607 return NULL;
1608 }
1609
Brian Paul178a1c52000-04-22 01:05:00 +00001610 if (_mesa_initialize_context(ctx, visual, share_list, driver_ctx, direct)) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001611 return ctx;
1612 }
1613 else {
1614 FREE(ctx);
1615 return NULL;
1616 }
1617}
1618
1619
1620
1621/*
1622 * Free the data associated with the given context.
1623 * But don't free() the GLcontext struct itself!
1624 */
Brian Paul178a1c52000-04-22 01:05:00 +00001625void
Brian Paulb1394fa2000-09-26 20:53:53 +00001626_mesa_free_context_data( GLcontext *ctx )
Brian Paul4d053dd2000-01-14 04:45:47 +00001627{
Brian Paul4d053dd2000-01-14 04:45:47 +00001628 struct gl_shine_tab *s, *tmps;
Brian Paul7fc29c52000-03-06 17:03:03 +00001629 GLuint i, j;
Brian Paul4d053dd2000-01-14 04:45:47 +00001630
1631 /* if we're destroying the current context, unbind it first */
Brian Paulb1394fa2000-09-26 20:53:53 +00001632 if (ctx == _mesa_get_current_context()) {
1633 _mesa_make_current(NULL, NULL);
Brian Paul4d053dd2000-01-14 04:45:47 +00001634 }
1635
Brian Paul4d053dd2000-01-14 04:45:47 +00001636 gl_matrix_dtr( &ctx->ModelView );
Brian Paul7fc29c52000-03-06 17:03:03 +00001637 for (i = 0; i < MAX_MODELVIEW_STACK_DEPTH - 1; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001638 gl_matrix_dtr( &ctx->ModelViewStack[i] );
1639 }
1640 gl_matrix_dtr( &ctx->ProjectionMatrix );
Brian Paul7fc29c52000-03-06 17:03:03 +00001641 for (i = 0; i < MAX_PROJECTION_STACK_DEPTH - 1; i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001642 gl_matrix_dtr( &ctx->ProjectionStack[i] );
1643 }
Brian Paul7fc29c52000-03-06 17:03:03 +00001644 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
1645 gl_matrix_dtr( &ctx->TextureMatrix[i] );
1646 for (j = 0; j < MAX_TEXTURE_STACK_DEPTH - 1; j++) {
1647 gl_matrix_dtr( &ctx->TextureStack[i][j] );
1648 }
1649 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001650
1651 FREE( ctx->PB );
1652
Brian Paul4bdcfe52000-04-17 17:57:04 +00001653 if (ctx->input != ctx->VB->IM)
Brian Paul4d053dd2000-01-14 04:45:47 +00001654 gl_immediate_free( ctx->input );
1655
1656 gl_vb_free( ctx->VB );
1657
Brian Paul9560f052000-01-31 23:11:39 +00001658 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
Brian Paul4d053dd2000-01-14 04:45:47 +00001659 ctx->Shared->RefCount--;
Brian Paul9560f052000-01-31 23:11:39 +00001660 assert(ctx->Shared->RefCount >= 0);
1661 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1662 if (ctx->Shared->RefCount == 0) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001663 /* free shared state */
1664 free_shared_state( ctx, ctx->Shared );
1665 }
1666
1667 foreach_s( s, tmps, ctx->ShineTabList ) {
1668 FREE( s );
1669 }
1670 FREE( ctx->ShineTabList );
1671
1672 /* Free proxy texture objects */
1673 gl_free_texture_object( NULL, ctx->Texture.Proxy1D );
1674 gl_free_texture_object( NULL, ctx->Texture.Proxy2D );
1675 gl_free_texture_object( NULL, ctx->Texture.Proxy3D );
1676
1677 /* Free evaluator data */
1678 if (ctx->EvalMap.Map1Vertex3.Points)
1679 FREE( ctx->EvalMap.Map1Vertex3.Points );
1680 if (ctx->EvalMap.Map1Vertex4.Points)
1681 FREE( ctx->EvalMap.Map1Vertex4.Points );
1682 if (ctx->EvalMap.Map1Index.Points)
1683 FREE( ctx->EvalMap.Map1Index.Points );
1684 if (ctx->EvalMap.Map1Color4.Points)
1685 FREE( ctx->EvalMap.Map1Color4.Points );
1686 if (ctx->EvalMap.Map1Normal.Points)
1687 FREE( ctx->EvalMap.Map1Normal.Points );
1688 if (ctx->EvalMap.Map1Texture1.Points)
1689 FREE( ctx->EvalMap.Map1Texture1.Points );
1690 if (ctx->EvalMap.Map1Texture2.Points)
1691 FREE( ctx->EvalMap.Map1Texture2.Points );
1692 if (ctx->EvalMap.Map1Texture3.Points)
1693 FREE( ctx->EvalMap.Map1Texture3.Points );
1694 if (ctx->EvalMap.Map1Texture4.Points)
1695 FREE( ctx->EvalMap.Map1Texture4.Points );
1696
1697 if (ctx->EvalMap.Map2Vertex3.Points)
1698 FREE( ctx->EvalMap.Map2Vertex3.Points );
1699 if (ctx->EvalMap.Map2Vertex4.Points)
1700 FREE( ctx->EvalMap.Map2Vertex4.Points );
1701 if (ctx->EvalMap.Map2Index.Points)
1702 FREE( ctx->EvalMap.Map2Index.Points );
1703 if (ctx->EvalMap.Map2Color4.Points)
1704 FREE( ctx->EvalMap.Map2Color4.Points );
1705 if (ctx->EvalMap.Map2Normal.Points)
1706 FREE( ctx->EvalMap.Map2Normal.Points );
1707 if (ctx->EvalMap.Map2Texture1.Points)
1708 FREE( ctx->EvalMap.Map2Texture1.Points );
1709 if (ctx->EvalMap.Map2Texture2.Points)
1710 FREE( ctx->EvalMap.Map2Texture2.Points );
1711 if (ctx->EvalMap.Map2Texture3.Points)
1712 FREE( ctx->EvalMap.Map2Texture3.Points );
1713 if (ctx->EvalMap.Map2Texture4.Points)
1714 FREE( ctx->EvalMap.Map2Texture4.Points );
1715
Brian Paul4bdcfe52000-04-17 17:57:04 +00001716 _mesa_free_colortable_data( &ctx->ColorTable );
1717 _mesa_free_colortable_data( &ctx->PostConvolutionColorTable );
1718 _mesa_free_colortable_data( &ctx->PostColorMatrixColorTable );
1719 _mesa_free_colortable_data( &ctx->Texture.Palette );
1720
Brian Paul4d053dd2000-01-14 04:45:47 +00001721 /* Free cache of immediate buffers. */
1722 while (ctx->nr_im_queued-- > 0) {
1723 struct immediate * next = ctx->freed_im_queue->next;
Brian Paul2d8db392000-06-27 22:10:00 +00001724 ALIGN_FREE( ctx->freed_im_queue );
Brian Paul4d053dd2000-01-14 04:45:47 +00001725 ctx->freed_im_queue = next;
1726 }
1727 gl_extensions_dtr(ctx);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001728
1729 FREE(ctx->Exec);
1730 FREE(ctx->Save);
Brian Paul4d053dd2000-01-14 04:45:47 +00001731}
1732
1733
1734
1735/*
1736 * Destroy a GLcontext structure.
jtgafb833d1999-08-19 00:55:39 +00001737 */
Brian Paul178a1c52000-04-22 01:05:00 +00001738void
Brian Paulb1394fa2000-09-26 20:53:53 +00001739_mesa_destroy_context( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001740{
1741 if (ctx) {
Brian Paulb1394fa2000-09-26 20:53:53 +00001742 _mesa_free_context_data(ctx);
Brian Paulbd5cdaf1999-10-13 18:42:49 +00001743 FREE( (void *) ctx );
jtgafb833d1999-08-19 00:55:39 +00001744 }
1745}
1746
1747
1748
1749/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001750 * Called by the driver after both the context and driver are fully
1751 * initialized. Currently just reads the config file.
jtgafb833d1999-08-19 00:55:39 +00001752 */
Brian Paul178a1c52000-04-22 01:05:00 +00001753void
Brian Paulb1394fa2000-09-26 20:53:53 +00001754_mesa_context_initialize( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001755{
Brian Paul00037781999-12-17 14:52:35 +00001756 gl_read_config_file( ctx );
jtgafb833d1999-08-19 00:55:39 +00001757}
1758
1759
1760
1761/*
1762 * Copy attribute groups from one context to another.
1763 * Input: src - source context
1764 * dst - destination context
1765 * mask - bitwise OR of GL_*_BIT flags
1766 */
Brian Paul178a1c52000-04-22 01:05:00 +00001767void
Brian Paulb1394fa2000-09-26 20:53:53 +00001768_mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
jtgafb833d1999-08-19 00:55:39 +00001769{
1770 if (mask & GL_ACCUM_BUFFER_BIT) {
1771 MEMCPY( &dst->Accum, &src->Accum, sizeof(struct gl_accum_attrib) );
1772 }
1773 if (mask & GL_COLOR_BUFFER_BIT) {
1774 MEMCPY( &dst->Color, &src->Color, sizeof(struct gl_colorbuffer_attrib) );
1775 }
1776 if (mask & GL_CURRENT_BIT) {
1777 MEMCPY( &dst->Current, &src->Current, sizeof(struct gl_current_attrib) );
1778 }
1779 if (mask & GL_DEPTH_BUFFER_BIT) {
1780 MEMCPY( &dst->Depth, &src->Depth, sizeof(struct gl_depthbuffer_attrib) );
1781 }
1782 if (mask & GL_ENABLE_BIT) {
1783 /* no op */
1784 }
1785 if (mask & GL_EVAL_BIT) {
1786 MEMCPY( &dst->Eval, &src->Eval, sizeof(struct gl_eval_attrib) );
1787 }
1788 if (mask & GL_FOG_BIT) {
1789 MEMCPY( &dst->Fog, &src->Fog, sizeof(struct gl_fog_attrib) );
1790 }
1791 if (mask & GL_HINT_BIT) {
1792 MEMCPY( &dst->Hint, &src->Hint, sizeof(struct gl_hint_attrib) );
1793 }
1794 if (mask & GL_LIGHTING_BIT) {
1795 MEMCPY( &dst->Light, &src->Light, sizeof(struct gl_light_attrib) );
Brian Paul00037781999-12-17 14:52:35 +00001796 /* gl_reinit_light_attrib( &dst->Light ); */
jtgafb833d1999-08-19 00:55:39 +00001797 }
1798 if (mask & GL_LINE_BIT) {
1799 MEMCPY( &dst->Line, &src->Line, sizeof(struct gl_line_attrib) );
1800 }
1801 if (mask & GL_LIST_BIT) {
1802 MEMCPY( &dst->List, &src->List, sizeof(struct gl_list_attrib) );
1803 }
1804 if (mask & GL_PIXEL_MODE_BIT) {
1805 MEMCPY( &dst->Pixel, &src->Pixel, sizeof(struct gl_pixel_attrib) );
1806 }
1807 if (mask & GL_POINT_BIT) {
1808 MEMCPY( &dst->Point, &src->Point, sizeof(struct gl_point_attrib) );
1809 }
1810 if (mask & GL_POLYGON_BIT) {
1811 MEMCPY( &dst->Polygon, &src->Polygon, sizeof(struct gl_polygon_attrib) );
1812 }
1813 if (mask & GL_POLYGON_STIPPLE_BIT) {
1814 /* Use loop instead of MEMCPY due to problem with Portland Group's
1815 * C compiler. Reported by John Stone.
1816 */
1817 int i;
1818 for (i=0;i<32;i++) {
1819 dst->PolygonStipple[i] = src->PolygonStipple[i];
1820 }
1821 }
1822 if (mask & GL_SCISSOR_BIT) {
1823 MEMCPY( &dst->Scissor, &src->Scissor, sizeof(struct gl_scissor_attrib) );
1824 }
1825 if (mask & GL_STENCIL_BUFFER_BIT) {
1826 MEMCPY( &dst->Stencil, &src->Stencil, sizeof(struct gl_stencil_attrib) );
1827 }
1828 if (mask & GL_TEXTURE_BIT) {
1829 MEMCPY( &dst->Texture, &src->Texture, sizeof(struct gl_texture_attrib) );
1830 }
1831 if (mask & GL_TRANSFORM_BIT) {
1832 MEMCPY( &dst->Transform, &src->Transform, sizeof(struct gl_transform_attrib) );
1833 }
1834 if (mask & GL_VIEWPORT_BIT) {
1835 MEMCPY( &dst->Viewport, &src->Viewport, sizeof(struct gl_viewport_attrib) );
1836 }
Keith Whitwella96308c2000-10-30 13:31:59 +00001837 /* XXX FIXME: Call callbacks?
1838 */
1839 dst->NewState = _NEW_ALL;
jtgafb833d1999-08-19 00:55:39 +00001840}
1841
1842
jtgafb833d1999-08-19 00:55:39 +00001843/*
Brian Paul00037781999-12-17 14:52:35 +00001844 * Set the current context, binding the given frame buffer to the context.
1845 */
Brian Paulb1394fa2000-09-26 20:53:53 +00001846void
1847_mesa_make_current( GLcontext *newCtx, GLframebuffer *buffer )
Brian Paul00037781999-12-17 14:52:35 +00001848{
Brian Paulb1394fa2000-09-26 20:53:53 +00001849 _mesa_make_current2( newCtx, buffer, buffer );
Brian Paul00037781999-12-17 14:52:35 +00001850}
1851
1852
1853/*
1854 * Bind the given context to the given draw-buffer and read-buffer
1855 * and make it the current context for this thread.
1856 */
Brian Paulb1394fa2000-09-26 20:53:53 +00001857void
1858_mesa_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
1859 GLframebuffer *readBuffer )
Brian Paul00037781999-12-17 14:52:35 +00001860{
1861#if 0
Brian Paulf9b97d92000-01-28 20:17:42 +00001862 GLcontext *oldCtx = gl_get_context();
Brian Paul00037781999-12-17 14:52:35 +00001863
1864 /* Flush the old context
1865 */
1866 if (oldCtx) {
Brian Paulb1394fa2000-09-26 20:53:53 +00001867 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(oldCtx, "_mesa_make_current");
Brian Paul00037781999-12-17 14:52:35 +00001868
1869 /* unbind frame buffers from context */
1870 if (oldCtx->DrawBuffer) {
1871 oldCtx->DrawBuffer = NULL;
1872 }
1873 if (oldCtx->ReadBuffer) {
1874 oldCtx->ReadBuffer = NULL;
1875 }
1876 }
1877#endif
1878
1879 /* We call this function periodically (just here for now) in
1880 * order to detect when multithreading has begun.
1881 */
1882 _glapi_check_multithread();
1883
Brian Paulf9b97d92000-01-28 20:17:42 +00001884 _glapi_set_context((void *) newCtx);
Brian Paulb1394fa2000-09-26 20:53:53 +00001885 ASSERT(_mesa_get_current_context() == newCtx);
Brian Paul00037781999-12-17 14:52:35 +00001886 if (newCtx) {
1887 SET_IMMEDIATE(newCtx, newCtx->input);
1888 _glapi_set_dispatch(newCtx->CurrentDispatch);
1889 }
1890 else {
1891 _glapi_set_dispatch(NULL); /* none current */
1892 }
1893
Brian Paulb1394fa2000-09-26 20:53:53 +00001894 if (MESA_VERBOSE) fprintf(stderr, "_mesa_make_current()\n");
Brian Paul00037781999-12-17 14:52:35 +00001895
1896 if (newCtx && drawBuffer && readBuffer) {
1897 /* TODO: check if newCtx and buffer's visual match??? */
1898 newCtx->DrawBuffer = drawBuffer;
1899 newCtx->ReadBuffer = readBuffer;
Keith Whitwella96308c2000-10-30 13:31:59 +00001900 newCtx->NewState |= _NEW_BUFFERS;
Brian Paul00037781999-12-17 14:52:35 +00001901 gl_update_state( newCtx );
1902 }
1903
1904 /* We can use this to help debug user's problems. Tell the to set
1905 * the MESA_INFO env variable before running their app. Then the
1906 * first time each context is made current we'll print some useful
1907 * information.
1908 */
1909 if (newCtx && newCtx->FirstTimeCurrent) {
1910 if (getenv("MESA_INFO")) {
1911 fprintf(stderr, "Mesa GL_VERSION = %s\n", (char *) _mesa_GetString(GL_VERSION));
1912 fprintf(stderr, "Mesa GL_RENDERER = %s\n", (char *) _mesa_GetString(GL_RENDERER));
1913 fprintf(stderr, "Mesa GL_VENDOR = %s\n", (char *) _mesa_GetString(GL_VENDOR));
1914 fprintf(stderr, "Mesa GL_EXTENSIONS = %s\n", (char *) _mesa_GetString(GL_EXTENSIONS));
Brian Paul09cb1481999-12-17 17:00:32 +00001915#if defined(THREADS)
1916 fprintf(stderr, "Mesa thread-safe: YES\n");
1917#else
1918 fprintf(stderr, "Mesa thread-safe: NO\n");
1919#endif
Brian Paul54287052000-01-17 20:00:15 +00001920#if defined(USE_X86_ASM)
1921 fprintf(stderr, "Mesa x86-optimized: YES\n");
1922#else
1923 fprintf(stderr, "Mesa x86-optimized: NO\n");
1924#endif
Brian Paul00037781999-12-17 14:52:35 +00001925 }
1926 newCtx->FirstTimeCurrent = GL_FALSE;
1927 }
1928}
1929
1930
1931
1932/*
1933 * Return current context handle for the calling thread.
1934 * This isn't the fastest way to get the current context.
1935 * If you need speed, see the GET_CURRENT_CONTEXT() macro in context.h
1936 */
Brian Paulb1394fa2000-09-26 20:53:53 +00001937GLcontext *
1938_mesa_get_current_context( void )
Brian Paul00037781999-12-17 14:52:35 +00001939{
Brian Paulf9b97d92000-01-28 20:17:42 +00001940 return (GLcontext *) _glapi_get_context();
Brian Paul00037781999-12-17 14:52:35 +00001941}
1942
1943
1944
1945/*
Brian Paulfbd8f211999-11-11 01:22:25 +00001946 * This should be called by device drivers just before they do a
1947 * swapbuffers. Any pending rendering commands will be executed.
jtgafb833d1999-08-19 00:55:39 +00001948 */
Brian Paulfbd8f211999-11-11 01:22:25 +00001949void
1950_mesa_swapbuffers(GLcontext *ctx)
jtgafb833d1999-08-19 00:55:39 +00001951{
Brian Paulfbd8f211999-11-11 01:22:25 +00001952 FLUSH_VB( ctx, "swap buffers" );
jtgafb833d1999-08-19 00:55:39 +00001953}
1954
1955
Brian Paul00037781999-12-17 14:52:35 +00001956
Brian Paulfbd8f211999-11-11 01:22:25 +00001957/*
1958 * Return pointer to this context's current API dispatch table.
1959 * It'll either be the immediate-mode execute dispatcher or the
1960 * display list compile dispatcher.
1961 */
1962struct _glapi_table *
1963_mesa_get_dispatch(GLcontext *ctx)
1964{
1965 return ctx->CurrentDispatch;
1966}
1967
1968
1969
jtgafb833d1999-08-19 00:55:39 +00001970/**********************************************************************/
1971/***** Miscellaneous functions *****/
1972/**********************************************************************/
1973
1974
1975/*
1976 * This function is called when the Mesa user has stumbled into a code
1977 * path which may not be implemented fully or correctly.
1978 */
1979void gl_problem( const GLcontext *ctx, const char *s )
1980{
1981 fprintf( stderr, "Mesa implementation error: %s\n", s );
Brian Paul413d6a22000-05-26 14:44:59 +00001982 fprintf( stderr, "Report to Mesa bug database at www.mesa3d.org\n" );
jtgafb833d1999-08-19 00:55:39 +00001983 (void) ctx;
1984}
1985
1986
1987
1988/*
1989 * This is called to inform the user that he or she has tried to do
1990 * something illogical or if there's likely a bug in their program
1991 * (like enabled depth testing without a depth buffer).
1992 */
Brian Paulb1394fa2000-09-26 20:53:53 +00001993void
1994_mesa_warning( const GLcontext *ctx, const char *s )
jtgafb833d1999-08-19 00:55:39 +00001995{
Brian Paulb1394fa2000-09-26 20:53:53 +00001996 (*ctx->imports.warning)((__GLcontext *) ctx, (char *) s);
jtgafb833d1999-08-19 00:55:39 +00001997}
1998
1999
2000
Brian Paulfa9df402000-02-02 19:16:46 +00002001/*
2002 * Compile an error into current display list.
2003 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002004void
2005_mesa_compile_error( GLcontext *ctx, GLenum error, const char *s )
jtgafb833d1999-08-19 00:55:39 +00002006{
2007 if (ctx->CompileFlag)
2008 gl_save_error( ctx, error, s );
2009
2010 if (ctx->ExecuteFlag)
2011 gl_error( ctx, error, s );
2012}
2013
2014
Brian Paulfa9df402000-02-02 19:16:46 +00002015
jtgafb833d1999-08-19 00:55:39 +00002016/*
2017 * This is Mesa's error handler. Normally, all that's done is the updating
2018 * of the current error value. If Mesa is compiled with -DDEBUG or if the
2019 * environment variable "MESA_DEBUG" is defined then a real error message
2020 * is printed to stderr.
Brian Paul7eb06032000-07-14 04:13:40 +00002021 * Input: ctx - the GL context
2022 * error - the error value
2023 * where - usually the name of function where error was detected
jtgafb833d1999-08-19 00:55:39 +00002024 */
Brian Paul7eb06032000-07-14 04:13:40 +00002025void
2026gl_error( GLcontext *ctx, GLenum error, const char *where )
jtgafb833d1999-08-19 00:55:39 +00002027{
Brian Paul7eb06032000-07-14 04:13:40 +00002028 const char *debugEnv = getenv("MESA_DEBUG");
jtgafb833d1999-08-19 00:55:39 +00002029 GLboolean debug;
2030
2031#ifdef DEBUG
Brian Paul7eb06032000-07-14 04:13:40 +00002032 if (debugEnv && strstr(debugEnv, "silent"))
jtgafb833d1999-08-19 00:55:39 +00002033 debug = GL_FALSE;
Brian Paul7eb06032000-07-14 04:13:40 +00002034 else
2035 debug = GL_TRUE;
2036#else
2037 if (debugEnv)
2038 debug = GL_TRUE;
2039 else
2040 debug = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00002041#endif
2042
2043 if (debug) {
Brian Paul7eb06032000-07-14 04:13:40 +00002044 const char *errstr;
jtgafb833d1999-08-19 00:55:39 +00002045 switch (error) {
2046 case GL_NO_ERROR:
Brian Paul7eb06032000-07-14 04:13:40 +00002047 errstr = "GL_NO_ERROR";
jtgafb833d1999-08-19 00:55:39 +00002048 break;
2049 case GL_INVALID_VALUE:
Brian Paul7eb06032000-07-14 04:13:40 +00002050 errstr = "GL_INVALID_VALUE";
jtgafb833d1999-08-19 00:55:39 +00002051 break;
2052 case GL_INVALID_ENUM:
Brian Paul7eb06032000-07-14 04:13:40 +00002053 errstr = "GL_INVALID_ENUM";
jtgafb833d1999-08-19 00:55:39 +00002054 break;
2055 case GL_INVALID_OPERATION:
Brian Paul7eb06032000-07-14 04:13:40 +00002056 errstr = "GL_INVALID_OPERATION";
jtgafb833d1999-08-19 00:55:39 +00002057 break;
2058 case GL_STACK_OVERFLOW:
Brian Paul7eb06032000-07-14 04:13:40 +00002059 errstr = "GL_STACK_OVERFLOW";
jtgafb833d1999-08-19 00:55:39 +00002060 break;
2061 case GL_STACK_UNDERFLOW:
Brian Paul7eb06032000-07-14 04:13:40 +00002062 errstr = "GL_STACK_UNDERFLOW";
jtgafb833d1999-08-19 00:55:39 +00002063 break;
2064 case GL_OUT_OF_MEMORY:
Brian Paul7eb06032000-07-14 04:13:40 +00002065 errstr = "GL_OUT_OF_MEMORY";
jtgafb833d1999-08-19 00:55:39 +00002066 break;
Brian Paul86586aa2000-06-29 18:55:52 +00002067 case GL_TABLE_TOO_LARGE:
Brian Paul7eb06032000-07-14 04:13:40 +00002068 errstr = "GL_TABLE_TOO_LARGE";
Brian Paul86586aa2000-06-29 18:55:52 +00002069 break;
jtgafb833d1999-08-19 00:55:39 +00002070 default:
Brian Paul7eb06032000-07-14 04:13:40 +00002071 errstr = "unknown";
jtgafb833d1999-08-19 00:55:39 +00002072 break;
2073 }
Brian Paul7eb06032000-07-14 04:13:40 +00002074 fprintf(stderr, "Mesa user error: %s in %s\n", errstr, where);
jtgafb833d1999-08-19 00:55:39 +00002075 }
2076
Brian Paul7eb06032000-07-14 04:13:40 +00002077 if (ctx->ErrorValue == GL_NO_ERROR) {
jtgafb833d1999-08-19 00:55:39 +00002078 ctx->ErrorValue = error;
2079 }
2080
2081 /* Call device driver's error handler, if any. This is used on the Mac. */
2082 if (ctx->Driver.Error) {
2083 (*ctx->Driver.Error)( ctx );
2084 }
2085}
2086
2087
2088
Brian Paulfa9df402000-02-02 19:16:46 +00002089void
2090_mesa_Finish( void )
jtgafb833d1999-08-19 00:55:39 +00002091{
Brian Paulfa9df402000-02-02 19:16:46 +00002092 GET_CURRENT_CONTEXT(ctx);
2093 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glFinish");
2094 if (ctx->Driver.Finish) {
2095 (*ctx->Driver.Finish)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002096 }
2097}
2098
2099
2100
Brian Paulfa9df402000-02-02 19:16:46 +00002101void
2102_mesa_Flush( void )
jtgafb833d1999-08-19 00:55:39 +00002103{
Brian Paulfa9df402000-02-02 19:16:46 +00002104 GET_CURRENT_CONTEXT(ctx);
2105 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glFlush");
2106 if (ctx->Driver.Flush) {
2107 (*ctx->Driver.Flush)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002108 }
jtgafb833d1999-08-19 00:55:39 +00002109}
Brian Paul48c6a6e2000-09-08 21:28:04 +00002110
2111
2112
2113const char *_mesa_prim_name[GL_POLYGON+2] = {
2114 "GL_POINTS",
2115 "GL_LINES",
2116 "GL_LINE_LOOP",
2117 "GL_LINE_STRIP",
2118 "GL_TRIANGLES",
2119 "GL_TRIANGLE_STRIP",
2120 "GL_TRIANGLE_FAN",
2121 "GL_QUADS",
2122 "GL_QUAD_STRIP",
2123 "GL_POLYGON",
2124 "culled primitive"
2125};
2126
Brian Paul1c56fdc2000-09-17 21:56:07 +00002127
2128GLenum gl_reduce_prim[GL_POLYGON+1] = {
2129 GL_POINTS,
2130 GL_LINES,
2131 GL_LINES,
2132 GL_LINES,
2133 GL_TRIANGLES,
2134 GL_TRIANGLES,
2135 GL_TRIANGLES,
2136 GL_TRIANGLES,
2137 GL_TRIANGLES,
2138 GL_TRIANGLES,
Gareth Hughesfc2427e2000-10-23 00:16:28 +00002139};