blob: 2baff7c2990be7eeb9831dbaeaf314f9f866c5bd [file] [log] [blame]
Brian Paul4753d602002-06-15 02:38:15 +00001/* $Id: context.c,v 1.167 2002/06/15 02:38:15 brianp Exp $ */
jtgafb833d1999-08-19 00:55:39 +00002
3/*
4 * Mesa 3-D graphics library
Brian Paul86b84272001-12-14 02:50:01 +00005 * Version: 4.1
jtgafb833d1999-08-19 00:55:39 +00006 *
Brian Paulbc42c192002-01-05 21:53:20 +00007 * Copyright (C) 1999-2002 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"
jtgafb833d1999-08-19 00:55:39 +000036#include "dlist.h"
37#include "eval.h"
38#include "enums.h"
Brian Paul585a68c1999-09-11 11:31:34 +000039#include "extensions.h"
jtgafb833d1999-08-19 00:55:39 +000040#include "fog.h"
Brian Paulb7a43041999-11-30 20:34:51 +000041#include "get.h"
Brian Paul9560f052000-01-31 23:11:39 +000042#include "glthread.h"
jtgafb833d1999-08-19 00:55:39 +000043#include "hash.h"
44#include "light.h"
jtgafb833d1999-08-19 00:55:39 +000045#include "macros.h"
Brian Paulfbd8f211999-11-11 01:22:25 +000046#include "mem.h"
jtgafb833d1999-08-19 00:55:39 +000047#include "mmath.h"
jtgafb833d1999-08-19 00:55:39 +000048#include "simple_list.h"
Brian Paulfa9df402000-02-02 19:16:46 +000049#include "state.h"
jtgafb833d1999-08-19 00:55:39 +000050#include "teximage.h"
51#include "texobj.h"
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000052#include "mtypes.h"
jtgafb833d1999-08-19 00:55:39 +000053#include "varray.h"
Brian Paul30f51ae2001-12-18 04:06:44 +000054#include "vpstate.h"
Gareth Hughesd4eb6652001-03-12 01:32:20 +000055#include "vtxfmt.h"
Keith Whitwell23caf202000-11-16 21:05:34 +000056#include "math/m_translate.h"
Keith Whitwell23caf202000-11-16 21:05:34 +000057#include "math/m_matrix.h"
58#include "math/m_xform.h"
Keith Whitwellf4b02d12001-01-05 05:31:42 +000059#include "math/mathmod.h"
jtgafb833d1999-08-19 00:55:39 +000060#endif
61
Brian Paul3b18a362000-09-26 15:27:20 +000062#if defined(MESA_TRACE)
Brian Paul45f36342000-09-05 20:28:06 +000063#include "Trace/tr_context.h"
64#include "Trace/tr_wrapper.h"
65#endif
66
davem69775355a2001-06-05 23:54:00 +000067#ifdef USE_SPARC_ASM
68#include "SPARC/sparc.h"
69#endif
jtgafb833d1999-08-19 00:55:39 +000070
Keith Whitwell23caf202000-11-16 21:05:34 +000071#ifndef MESA_VERBOSE
Keith Whitwell306d3fc2002-04-09 16:56:50 +000072int MESA_VERBOSE = 0;
Keith Whitwell23caf202000-11-16 21:05:34 +000073#endif
74
75#ifndef MESA_DEBUG_FLAGS
Keith Whitwell306d3fc2002-04-09 16:56:50 +000076int MESA_DEBUG_FLAGS = 0;
Keith Whitwell23caf202000-11-16 21:05:34 +000077#endif
Brian Paulb1394fa2000-09-26 20:53:53 +000078
Brian Paul86b84272001-12-14 02:50:01 +000079
Brian Paul9a33a112002-06-13 04:28:29 +000080static void
81free_shared_state( GLcontext *ctx, struct gl_shared_state *ss );
82
Brian Paul86b84272001-12-14 02:50:01 +000083
Brian Paulb1394fa2000-09-26 20:53:53 +000084/**********************************************************************/
85/***** OpenGL SI-style interface (new in Mesa 3.5) *****/
86/**********************************************************************/
87
Brian Paul9a33a112002-06-13 04:28:29 +000088/* Called by window system/device driver (via gc->exports.destroyCurrent())
89 * when the rendering context is to be destroyed.
90 */
91GLboolean
92_mesa_destroyContext(__GLcontext *gc)
Brian Paulb1394fa2000-09-26 20:53:53 +000093{
94 if (gc) {
95 _mesa_free_context_data(gc);
96 (*gc->imports.free)(gc, gc);
97 }
98 return GL_TRUE;
99}
100
Brian Paul9a33a112002-06-13 04:28:29 +0000101/* Called by window system/device driver (via gc->exports.loseCurrent())
102 * when the rendering context is made non-current.
103 */
104GLboolean
105_mesa_loseCurrent(__GLcontext *gc)
106{
107 /* XXX unbind context from thread */
108 return GL_TRUE;
109}
110
111/* Called by window system/device driver (via gc->exports.makeCurrent())
112 * when the rendering context is made current.
113 */
114GLboolean
115_mesa_makeCurrent(__GLcontext *gc)
116{
117 /* XXX bind context to thread */
118 return GL_TRUE;
119}
120
121/* Called by window system/device driver - yadda, yadda, yadda.
122 * See above comments.
123 */
124GLboolean
125_mesa_shareContext(__GLcontext *gc, __GLcontext *gcShare)
126{
127 if (gc && gcShare && gc->Shared && gcShare->Shared) {
128 gc->Shared->RefCount--;
129 if (gc->Shared->RefCount == 0) {
130 free_shared_state(gc, gc->Shared);
131 }
132 gc->Shared = gcShare->Shared;
133 gc->Shared->RefCount++;
134 return GL_TRUE;
135 }
136 else {
137 return GL_FALSE;
138 }
139}
140
141GLboolean
142_mesa_copyContext(__GLcontext *dst, const __GLcontext *src, GLuint mask)
143{
144 if (dst && src) {
145 _mesa_copy_context( src, dst, mask );
146 return GL_TRUE;
147 }
148 else {
149 return GL_FALSE;
150 }
151}
152
153GLboolean
154_mesa_forceCurrent(__GLcontext *gc)
155{
156 return GL_TRUE;
157}
158
159GLboolean
160_mesa_notifyResize(__GLcontext *gc)
161{
162 GLint x, y;
163 GLuint width, height;
164 __GLdrawablePrivate *d = gc->imports.getDrawablePrivate(gc);
165 if (!d || !d->getDrawableSize)
166 return GL_FALSE;
167 d->getDrawableSize( d, &x, &y, &width, &height );
168 /* update viewport, resize software buffers, etc. */
169 return GL_TRUE;
170}
171
172void
173_mesa_notifyDestroy(__GLcontext *gc)
174{
175}
176
177/* Called by window system just before swapping buffers.
178 * We have to finish any pending rendering.
179 */
180void
181_mesa_notifySwapBuffers(__GLcontext *gc)
182{
183 FLUSH_VERTICES( gc, 0 );
184}
185
186struct __GLdispatchStateRec *
187_mesa_dispatchExec(__GLcontext *gc)
188{
189 return NULL;
190}
191
192void
193_mesa_beginDispatchOverride(__GLcontext *gc)
194{
195}
196
197void
198_mesa_endDispatchOverride(__GLcontext *gc)
199{
200}
201
202/* Setup the exports. The window system will call these functions
203 * when it needs Mesa to do something.
204 * NOTE: Device drivers should override these functions! For example,
205 * the Xlib driver should plug in the XMesa*-style functions into this
206 * structure. The XMesa-style functions should then call the _mesa_*
207 * version of these functions. This is an approximation to OO design
208 * (inheritance and virtual functions).
209 */
210static void
211_mesa_init_default_exports(__GLexports *exports)
212{
213 exports->destroyContext = _mesa_destroyContext;
214 exports->loseCurrent = _mesa_loseCurrent;
215 exports->makeCurrent = _mesa_makeCurrent;
216 exports->shareContext = _mesa_shareContext;
217 exports->copyContext = _mesa_copyContext;
218 exports->forceCurrent = _mesa_forceCurrent;
219 exports->notifyResize = _mesa_notifyResize;
Brian Paul2f35d5e2002-06-13 04:31:09 +0000220 exports->notifyDestroy = _mesa_notifyDestroy;
Brian Paul9a33a112002-06-13 04:28:29 +0000221 exports->notifySwapBuffers = _mesa_notifySwapBuffers;
222 exports->dispatchExec = _mesa_dispatchExec;
223 exports->beginDispatchOverride = _mesa_beginDispatchOverride;
224 exports->endDispatchOverride = _mesa_endDispatchOverride;
225}
226
227
Brian Paulb1394fa2000-09-26 20:53:53 +0000228
229/* exported OpenGL SI interface */
230__GLcontext *
231__glCoreCreateContext(__GLimports *imports, __GLcontextModes *modes)
232{
233 GLcontext *ctx;
234
Brian Paul4753d602002-06-15 02:38:15 +0000235 ctx = (GLcontext *) (*imports->calloc)(NULL, 1, sizeof(GLcontext));
Brian Paulb1394fa2000-09-26 20:53:53 +0000236 if (ctx == NULL) {
237 return NULL;
238 }
Brian Paul9a33a112002-06-13 04:28:29 +0000239 ctx->Driver.CurrentExecPrimitive=0; /* XXX why is this here??? */
Brian Paulb1394fa2000-09-26 20:53:53 +0000240 ctx->imports = *imports;
Brian Paul4753d602002-06-15 02:38:15 +0000241 _mesa_init_default_exports(&(ctx->exports));
Brian Paulb1394fa2000-09-26 20:53:53 +0000242
243 _mesa_initialize_visual(&ctx->Visual,
244 modes->rgbMode,
245 modes->doubleBufferMode,
246 modes->stereoMode,
247 modes->redBits,
248 modes->greenBits,
249 modes->blueBits,
250 modes->alphaBits,
251 modes->indexBits,
252 modes->depthBits,
253 modes->stencilBits,
254 modes->accumRedBits,
255 modes->accumGreenBits,
256 modes->accumBlueBits,
257 modes->accumAlphaBits,
258 0);
259
Brian Paul9a33a112002-06-13 04:28:29 +0000260 _mesa_initialize_context(ctx, &ctx->Visual, NULL, imports);
Brian Paulb1394fa2000-09-26 20:53:53 +0000261
262 return ctx;
263}
264
265
266/* exported OpenGL SI interface */
267void
268__glCoreNopDispatch(void)
269{
270#if 0
271 /* SI */
272 __gl_dispatch = __glNopDispatchState;
273#else
274 /* Mesa */
275 _glapi_set_dispatch(NULL);
276#endif
277}
278
279
jtgafb833d1999-08-19 00:55:39 +0000280/**********************************************************************/
Brian Paul4d053dd2000-01-14 04:45:47 +0000281/***** GL Visual allocation/destruction *****/
282/**********************************************************************/
283
284
285/*
286 * Allocate a new GLvisual object.
287 * Input: rgbFlag - GL_TRUE=RGB(A) mode, GL_FALSE=Color Index mode
Brian Paul4d053dd2000-01-14 04:45:47 +0000288 * dbFlag - double buffering?
289 * stereoFlag - stereo buffer?
Brian Pauled30dfa2000-03-03 17:47:39 +0000290 * depthBits - requested bits per depth buffer value
291 * Any value in [0, 32] is acceptable but the actual
292 * depth type will be GLushort or GLuint as needed.
293 * stencilBits - requested minimum bits per stencil buffer value
294 * accumBits - requested minimum bits per accum buffer component
295 * indexBits - number of bits per pixel if rgbFlag==GL_FALSE
296 * red/green/blue/alphaBits - number of bits per color component
297 * in frame buffer for RGB(A) mode.
298 * We always use 8 in core Mesa though.
Brian Paul4d053dd2000-01-14 04:45:47 +0000299 * Return: pointer to new GLvisual or NULL if requested parameters can't
300 * be met.
301 */
Brian Paulb371e0d2000-03-31 01:05:51 +0000302GLvisual *
303_mesa_create_visual( GLboolean rgbFlag,
Brian Paulb371e0d2000-03-31 01:05:51 +0000304 GLboolean dbFlag,
305 GLboolean stereoFlag,
306 GLint redBits,
307 GLint greenBits,
308 GLint blueBits,
309 GLint alphaBits,
310 GLint indexBits,
311 GLint depthBits,
312 GLint stencilBits,
313 GLint accumRedBits,
314 GLint accumGreenBits,
315 GLint accumBlueBits,
316 GLint accumAlphaBits,
317 GLint numSamples )
Brian Paul4d053dd2000-01-14 04:45:47 +0000318{
Brian Paul178a1c52000-04-22 01:05:00 +0000319 GLvisual *vis = (GLvisual *) CALLOC( sizeof(GLvisual) );
320 if (vis) {
Brian Paule70c6232000-05-04 13:53:55 +0000321 if (!_mesa_initialize_visual(vis, rgbFlag, dbFlag, stereoFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000322 redBits, greenBits, blueBits, alphaBits,
323 indexBits, depthBits, stencilBits,
324 accumRedBits, accumGreenBits,
325 accumBlueBits, accumAlphaBits,
Brian Paulb1394fa2000-09-26 20:53:53 +0000326 numSamples)) {
Brian Paul178a1c52000-04-22 01:05:00 +0000327 FREE(vis);
328 return NULL;
329 }
330 }
331 return vis;
332}
333
334
335/*
336 * Initialize the fields of the given GLvisual.
337 * Input: see _mesa_create_visual() above.
338 * Return: GL_TRUE = success
339 * GL_FALSE = failure.
340 */
341GLboolean
342_mesa_initialize_visual( GLvisual *vis,
343 GLboolean rgbFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000344 GLboolean dbFlag,
345 GLboolean stereoFlag,
346 GLint redBits,
347 GLint greenBits,
348 GLint blueBits,
349 GLint alphaBits,
350 GLint indexBits,
351 GLint depthBits,
352 GLint stencilBits,
353 GLint accumRedBits,
354 GLint accumGreenBits,
355 GLint accumBlueBits,
356 GLint accumAlphaBits,
357 GLint numSamples )
358{
Brian Paulb6bcae52001-01-23 23:39:36 +0000359 (void) numSamples;
360
Brian Paul178a1c52000-04-22 01:05:00 +0000361 assert(vis);
Brian Paul4d053dd2000-01-14 04:45:47 +0000362
Brian Pauled30dfa2000-03-03 17:47:39 +0000363 /* This is to catch bad values from device drivers not updated for
364 * Mesa 3.3. Some device drivers just passed 1. That's a REALLY
365 * bad value now (a 1-bit depth buffer!?!).
366 */
367 assert(depthBits == 0 || depthBits > 1);
368
369 if (depthBits < 0 || depthBits > 32) {
Brian Paul178a1c52000-04-22 01:05:00 +0000370 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000371 }
Brian Pauled30dfa2000-03-03 17:47:39 +0000372 if (stencilBits < 0 || stencilBits > (GLint) (8 * sizeof(GLstencil))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000373 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000374 }
Brian Paulb371e0d2000-03-31 01:05:51 +0000375 if (accumRedBits < 0 || accumRedBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000376 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000377 }
378 if (accumGreenBits < 0 || accumGreenBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000379 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000380 }
381 if (accumBlueBits < 0 || accumBlueBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000382 return GL_FALSE;
Brian Paulb371e0d2000-03-31 01:05:51 +0000383 }
384 if (accumAlphaBits < 0 || accumAlphaBits > (GLint) (8 * sizeof(GLaccum))) {
Brian Paul178a1c52000-04-22 01:05:00 +0000385 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000386 }
387
Brian Paulb6bcae52001-01-23 23:39:36 +0000388 vis->rgbMode = rgbFlag;
389 vis->doubleBufferMode = dbFlag;
390 vis->stereoMode = stereoFlag;
391 vis->redBits = redBits;
392 vis->greenBits = greenBits;
393 vis->blueBits = blueBits;
394 vis->alphaBits = alphaBits;
Brian Paul4d053dd2000-01-14 04:45:47 +0000395
Brian Paulb6bcae52001-01-23 23:39:36 +0000396 vis->indexBits = indexBits;
397 vis->depthBits = depthBits;
398 vis->accumRedBits = (accumRedBits > 0) ? (8 * sizeof(GLaccum)) : 0;
399 vis->accumGreenBits = (accumGreenBits > 0) ? (8 * sizeof(GLaccum)) : 0;
400 vis->accumBlueBits = (accumBlueBits > 0) ? (8 * sizeof(GLaccum)) : 0;
401 vis->accumAlphaBits = (accumAlphaBits > 0) ? (8 * sizeof(GLaccum)) : 0;
402 vis->stencilBits = (stencilBits > 0) ? (8 * sizeof(GLstencil)) : 0;
Brian Pauled30dfa2000-03-03 17:47:39 +0000403
Brian Paul178a1c52000-04-22 01:05:00 +0000404 return GL_TRUE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000405}
406
407
Brian Paulb371e0d2000-03-31 01:05:51 +0000408void
409_mesa_destroy_visual( GLvisual *vis )
410{
411 FREE(vis);
412}
413
414
Brian Paul4d053dd2000-01-14 04:45:47 +0000415/**********************************************************************/
416/***** GL Framebuffer allocation/destruction *****/
417/**********************************************************************/
418
419
420/*
421 * Create a new framebuffer. A GLframebuffer is a struct which
422 * encapsulates the depth, stencil and accum buffers and related
423 * parameters.
Brian Paulbe3602d2001-02-28 00:27:48 +0000424 * Input: visual - a GLvisual pointer (we copy the struct contents)
Brian Paul4d053dd2000-01-14 04:45:47 +0000425 * softwareDepth - create/use a software depth buffer?
426 * softwareStencil - create/use a software stencil buffer?
427 * softwareAccum - create/use a software accum buffer?
428 * softwareAlpha - create/use a software alpha buffer?
Brian Paul4d053dd2000-01-14 04:45:47 +0000429 * Return: pointer to new GLframebuffer struct or NULL if error.
430 */
Brian Paul178a1c52000-04-22 01:05:00 +0000431GLframebuffer *
Brian Paulbe3602d2001-02-28 00:27:48 +0000432_mesa_create_framebuffer( const GLvisual *visual,
Brian Paulb1394fa2000-09-26 20:53:53 +0000433 GLboolean softwareDepth,
434 GLboolean softwareStencil,
435 GLboolean softwareAccum,
436 GLboolean softwareAlpha )
Brian Paul4d053dd2000-01-14 04:45:47 +0000437{
Brian Paul178a1c52000-04-22 01:05:00 +0000438 GLframebuffer *buffer = CALLOC_STRUCT(gl_frame_buffer);
439 assert(visual);
440 if (buffer) {
441 _mesa_initialize_framebuffer(buffer, visual,
442 softwareDepth, softwareStencil,
443 softwareAccum, softwareAlpha );
Brian Paul4d053dd2000-01-14 04:45:47 +0000444 }
Brian Paul178a1c52000-04-22 01:05:00 +0000445 return buffer;
446}
447
448
449/*
450 * Initialize a GLframebuffer object.
Brian Paulb1394fa2000-09-26 20:53:53 +0000451 * Input: See _mesa_create_framebuffer() above.
Brian Paul178a1c52000-04-22 01:05:00 +0000452 */
453void
454_mesa_initialize_framebuffer( GLframebuffer *buffer,
Brian Paulbe3602d2001-02-28 00:27:48 +0000455 const GLvisual *visual,
Brian Paul178a1c52000-04-22 01:05:00 +0000456 GLboolean softwareDepth,
457 GLboolean softwareStencil,
458 GLboolean softwareAccum,
459 GLboolean softwareAlpha )
460{
461 assert(buffer);
462 assert(visual);
Brian Paul4d053dd2000-01-14 04:45:47 +0000463
464 /* sanity checks */
465 if (softwareDepth ) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000466 assert(visual->depthBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000467 }
468 if (softwareStencil) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000469 assert(visual->stencilBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000470 }
471 if (softwareAccum) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000472 assert(visual->rgbMode);
473 assert(visual->accumRedBits > 0);
474 assert(visual->accumGreenBits > 0);
475 assert(visual->accumBlueBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000476 }
477 if (softwareAlpha) {
Brian Paulb6bcae52001-01-23 23:39:36 +0000478 assert(visual->rgbMode);
479 assert(visual->alphaBits > 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000480 }
481
Brian Paul75978bd2001-04-27 21:17:20 +0000482 buffer->Visual = *visual;
Brian Paul4d053dd2000-01-14 04:45:47 +0000483 buffer->UseSoftwareDepthBuffer = softwareDepth;
484 buffer->UseSoftwareStencilBuffer = softwareStencil;
485 buffer->UseSoftwareAccumBuffer = softwareAccum;
486 buffer->UseSoftwareAlphaBuffers = softwareAlpha;
Brian Paul4d053dd2000-01-14 04:45:47 +0000487}
488
489
Brian Paul4d053dd2000-01-14 04:45:47 +0000490/*
491 * Free a framebuffer struct and its buffers.
492 */
Brian Paul178a1c52000-04-22 01:05:00 +0000493void
Brian Paulb1394fa2000-09-26 20:53:53 +0000494_mesa_destroy_framebuffer( GLframebuffer *buffer )
Brian Paul4d053dd2000-01-14 04:45:47 +0000495{
496 if (buffer) {
Brian Paul75978bd2001-04-27 21:17:20 +0000497 _mesa_free_framebuffer_data(buffer);
Brian Paul4d053dd2000-01-14 04:45:47 +0000498 FREE(buffer);
499 }
500}
501
502
Brian Paul75978bd2001-04-27 21:17:20 +0000503/*
504 * Free the data hanging off of <buffer>, but not <buffer> itself.
505 */
506void
507_mesa_free_framebuffer_data( GLframebuffer *buffer )
508{
509 if (!buffer)
510 return;
511
512 if (buffer->DepthBuffer) {
Brian Paulaeb44342002-03-19 16:47:04 +0000513 MESA_PBUFFER_FREE( buffer->DepthBuffer );
Brian Paul75978bd2001-04-27 21:17:20 +0000514 buffer->DepthBuffer = NULL;
515 }
516 if (buffer->Accum) {
Brian Paulaeb44342002-03-19 16:47:04 +0000517 MESA_PBUFFER_FREE( buffer->Accum );
Brian Paul75978bd2001-04-27 21:17:20 +0000518 buffer->Accum = NULL;
519 }
520 if (buffer->Stencil) {
Brian Paulaeb44342002-03-19 16:47:04 +0000521 MESA_PBUFFER_FREE( buffer->Stencil );
Brian Paul75978bd2001-04-27 21:17:20 +0000522 buffer->Stencil = NULL;
523 }
524 if (buffer->FrontLeftAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000525 MESA_PBUFFER_FREE( buffer->FrontLeftAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000526 buffer->FrontLeftAlpha = NULL;
527 }
528 if (buffer->BackLeftAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000529 MESA_PBUFFER_FREE( buffer->BackLeftAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000530 buffer->BackLeftAlpha = NULL;
531 }
532 if (buffer->FrontRightAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000533 MESA_PBUFFER_FREE( buffer->FrontRightAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000534 buffer->FrontRightAlpha = NULL;
535 }
536 if (buffer->BackRightAlpha) {
Brian Paulaeb44342002-03-19 16:47:04 +0000537 MESA_PBUFFER_FREE( buffer->BackRightAlpha );
Brian Paul75978bd2001-04-27 21:17:20 +0000538 buffer->BackRightAlpha = NULL;
539 }
540}
541
542
Brian Paul4d053dd2000-01-14 04:45:47 +0000543
544/**********************************************************************/
jtgafb833d1999-08-19 00:55:39 +0000545/***** Context allocation, initialization, destroying *****/
546/**********************************************************************/
547
548
Brian Paul9560f052000-01-31 23:11:39 +0000549_glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
550
551
jtgafb833d1999-08-19 00:55:39 +0000552/*
553 * This function just calls all the various one-time-init functions in Mesa.
554 */
Brian Paul178a1c52000-04-22 01:05:00 +0000555static void
Brian Paul4753d602002-06-15 02:38:15 +0000556one_time_init( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000557{
558 static GLboolean alreadyCalled = GL_FALSE;
Brian Paul9560f052000-01-31 23:11:39 +0000559 _glthread_LOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000560 if (!alreadyCalled) {
Brian Paul4d053dd2000-01-14 04:45:47 +0000561 /* do some implementation tests */
562 assert( sizeof(GLbyte) == 1 );
563 assert( sizeof(GLshort) >= 2 );
564 assert( sizeof(GLint) >= 4 );
565 assert( sizeof(GLubyte) == 1 );
566 assert( sizeof(GLushort) >= 2 );
567 assert( sizeof(GLuint) >= 4 );
568
Brian Paul08836342001-03-03 20:33:27 +0000569 _mesa_init_lists();
Keith Whitwell23caf202000-11-16 21:05:34 +0000570
Keith Whitwell23caf202000-11-16 21:05:34 +0000571 _math_init();
Brian Paul69755402001-02-26 23:58:12 +0000572 _mesa_init_math();
Brian Paul68ee4bc2000-01-28 19:02:22 +0000573
davem69775355a2001-06-05 23:54:00 +0000574#ifdef USE_SPARC_ASM
575 _mesa_init_sparc_glapi_relocs();
576#endif
Brian Paul4753d602002-06-15 02:38:15 +0000577 if (ctx->imports.getenv(ctx, "MESA_DEBUG")) {
Brian Paul68ee4bc2000-01-28 19:02:22 +0000578 _glapi_noop_enable_warnings(GL_TRUE);
579 }
580 else {
581 _glapi_noop_enable_warnings(GL_FALSE);
582 }
583
jtgafb833d1999-08-19 00:55:39 +0000584#if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
Brian Paul4753d602002-06-15 02:38:15 +0000585 fprintf(stderr, "Mesa DEBUG build %s %s\n", __DATE__, __TIME__);
jtgafb833d1999-08-19 00:55:39 +0000586#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000587
588 alreadyCalled = GL_TRUE;
589 }
Brian Paul9560f052000-01-31 23:11:39 +0000590 _glthread_UNLOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000591}
592
593
Brian Paul86b84272001-12-14 02:50:01 +0000594static void
595init_matrix_stack( struct matrix_stack *stack,
596 GLuint maxDepth, GLuint dirtyFlag )
597{
598 GLuint i;
599
600 stack->Depth = 0;
601 stack->MaxDepth = maxDepth;
602 stack->DirtyFlag = dirtyFlag;
Brian Paul86b84272001-12-14 02:50:01 +0000603 /* The stack */
Brian Pauldb07de02002-04-19 00:23:08 +0000604 stack->Stack = (GLmatrix *) CALLOC(maxDepth * sizeof(GLmatrix));
Brian Paul86b84272001-12-14 02:50:01 +0000605 for (i = 0; i < maxDepth; i++) {
606 _math_matrix_ctr(&stack->Stack[i]);
607 _math_matrix_alloc_inv(&stack->Stack[i]);
608 }
Brian Paul30f51ae2001-12-18 04:06:44 +0000609 stack->Top = stack->Stack;
Brian Paul86b84272001-12-14 02:50:01 +0000610}
611
612
613static void
614free_matrix_stack( struct matrix_stack *stack )
615{
616 GLuint i;
Brian Paul86b84272001-12-14 02:50:01 +0000617 for (i = 0; i < stack->MaxDepth; i++) {
618 _math_matrix_dtr(&stack->Stack[i]);
619 }
Brian Paulc4afba32002-02-05 23:21:45 +0000620 FREE(stack->Stack);
Brian Paul30f51ae2001-12-18 04:06:44 +0000621 stack->Stack = stack->Top = NULL;
Brian Paul86b84272001-12-14 02:50:01 +0000622}
623
Brian Paul4d053dd2000-01-14 04:45:47 +0000624
jtgafb833d1999-08-19 00:55:39 +0000625/*
626 * Allocate and initialize a shared context state structure.
627 */
Brian Paul178a1c52000-04-22 01:05:00 +0000628static struct gl_shared_state *
629alloc_shared_state( void )
jtgafb833d1999-08-19 00:55:39 +0000630{
jtgafb833d1999-08-19 00:55:39 +0000631 struct gl_shared_state *ss;
632 GLboolean outOfMemory;
633
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000634 ss = CALLOC_STRUCT(gl_shared_state);
jtgafb833d1999-08-19 00:55:39 +0000635 if (!ss)
636 return NULL;
637
Brian Paule4b684c2000-09-12 21:07:40 +0000638 _glthread_INIT_MUTEX(ss->Mutex);
jtgafb833d1999-08-19 00:55:39 +0000639
Brian Paule4b684c2000-09-12 21:07:40 +0000640 ss->DisplayList = _mesa_NewHashTable();
Brian Paulbb797902000-01-24 16:19:54 +0000641 ss->TexObjects = _mesa_NewHashTable();
Brian Paul30f51ae2001-12-18 04:06:44 +0000642 ss->VertexPrograms = _mesa_NewHashTable();
jtgafb833d1999-08-19 00:55:39 +0000643
644 /* Default Texture objects */
645 outOfMemory = GL_FALSE;
Brian Paula8523782000-11-19 23:10:25 +0000646
647 ss->Default1D = _mesa_alloc_texture_object(ss, 0, 1);
648 if (!ss->Default1D) {
649 outOfMemory = GL_TRUE;
650 }
jtgafb833d1999-08-19 00:55:39 +0000651
Brian Paula8523782000-11-19 23:10:25 +0000652 ss->Default2D = _mesa_alloc_texture_object(ss, 0, 2);
653 if (!ss->Default2D) {
654 outOfMemory = GL_TRUE;
655 }
Brian Paula8523782000-11-19 23:10:25 +0000656
657 ss->Default3D = _mesa_alloc_texture_object(ss, 0, 3);
658 if (!ss->Default3D) {
659 outOfMemory = GL_TRUE;
660 }
Brian Paula8523782000-11-19 23:10:25 +0000661
662 ss->DefaultCubeMap = _mesa_alloc_texture_object(ss, 0, 6);
Brian Paul413d6a22000-05-26 14:44:59 +0000663 if (!ss->DefaultCubeMap) {
664 outOfMemory = GL_TRUE;
665 }
Brian Paul413d6a22000-05-26 14:44:59 +0000666
Brian Paul30f51ae2001-12-18 04:06:44 +0000667 if (!ss->DisplayList || !ss->TexObjects || !ss->VertexPrograms
668 || outOfMemory) {
jtgafb833d1999-08-19 00:55:39 +0000669 /* Ran out of memory at some point. Free everything and return NULL */
670 if (ss->DisplayList)
Brian Paulbb797902000-01-24 16:19:54 +0000671 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000672 if (ss->TexObjects)
Brian Paulbb797902000-01-24 16:19:54 +0000673 _mesa_DeleteHashTable(ss->TexObjects);
Brian Paul30f51ae2001-12-18 04:06:44 +0000674 if (ss->VertexPrograms)
675 _mesa_DeleteHashTable(ss->VertexPrograms);
Brian Paula8523782000-11-19 23:10:25 +0000676 if (ss->Default1D)
677 _mesa_free_texture_object(ss, ss->Default1D);
678 if (ss->Default2D)
679 _mesa_free_texture_object(ss, ss->Default2D);
680 if (ss->Default3D)
681 _mesa_free_texture_object(ss, ss->Default3D);
Brian Paul413d6a22000-05-26 14:44:59 +0000682 if (ss->DefaultCubeMap)
Brian Paula8523782000-11-19 23:10:25 +0000683 _mesa_free_texture_object(ss, ss->DefaultCubeMap);
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000684 FREE(ss);
jtgafb833d1999-08-19 00:55:39 +0000685 return NULL;
686 }
687 else {
688 return ss;
689 }
690}
691
692
693/*
694 * Deallocate a shared state context and all children structures.
695 */
Brian Paul178a1c52000-04-22 01:05:00 +0000696static void
697free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
jtgafb833d1999-08-19 00:55:39 +0000698{
699 /* Free display lists */
700 while (1) {
Brian Paulbb797902000-01-24 16:19:54 +0000701 GLuint list = _mesa_HashFirstEntry(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000702 if (list) {
Brian Paul08836342001-03-03 20:33:27 +0000703 _mesa_destroy_list(ctx, list);
jtgafb833d1999-08-19 00:55:39 +0000704 }
705 else {
706 break;
707 }
708 }
Brian Paulbb797902000-01-24 16:19:54 +0000709 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000710
711 /* Free texture objects */
Brian Paul5a2f32b2001-04-25 18:21:05 +0000712 while (ss->TexObjectList) {
jtgafb833d1999-08-19 00:55:39 +0000713 if (ctx->Driver.DeleteTexture)
714 (*ctx->Driver.DeleteTexture)( ctx, ss->TexObjectList );
715 /* this function removes from linked list too! */
Brian Paula8523782000-11-19 23:10:25 +0000716 _mesa_free_texture_object(ss, ss->TexObjectList);
jtgafb833d1999-08-19 00:55:39 +0000717 }
Brian Paulbb797902000-01-24 16:19:54 +0000718 _mesa_DeleteHashTable(ss->TexObjects);
jtgafb833d1999-08-19 00:55:39 +0000719
Brian Paul30f51ae2001-12-18 04:06:44 +0000720 /* Free vertex programs */
721 while (1) {
722 GLuint prog = _mesa_HashFirstEntry(ss->VertexPrograms);
723 if (prog) {
724 _mesa_delete_program(ctx, prog);
725 }
726 else {
727 break;
728 }
729 }
730 _mesa_DeleteHashTable(ss->VertexPrograms);
731
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000732 FREE(ss);
jtgafb833d1999-08-19 00:55:39 +0000733}
734
735
736
jtgafb833d1999-08-19 00:55:39 +0000737/*
738 * Initialize the nth light. Note that the defaults for light 0 are
739 * different than the other lights.
740 */
Brian Paul178a1c52000-04-22 01:05:00 +0000741static void
742init_light( struct gl_light *l, GLuint n )
jtgafb833d1999-08-19 00:55:39 +0000743{
744 make_empty_list( l );
745
746 ASSIGN_4V( l->Ambient, 0.0, 0.0, 0.0, 1.0 );
747 if (n==0) {
748 ASSIGN_4V( l->Diffuse, 1.0, 1.0, 1.0, 1.0 );
749 ASSIGN_4V( l->Specular, 1.0, 1.0, 1.0, 1.0 );
750 }
751 else {
752 ASSIGN_4V( l->Diffuse, 0.0, 0.0, 0.0, 1.0 );
753 ASSIGN_4V( l->Specular, 0.0, 0.0, 0.0, 1.0 );
754 }
755 ASSIGN_4V( l->EyePosition, 0.0, 0.0, 1.0, 0.0 );
756 ASSIGN_3V( l->EyeDirection, 0.0, 0.0, -1.0 );
757 l->SpotExponent = 0.0;
Brian Paul08836342001-03-03 20:33:27 +0000758 _mesa_invalidate_spot_exp_table( l );
jtgafb833d1999-08-19 00:55:39 +0000759 l->SpotCutoff = 180.0;
Keith Whitwell14940c42000-11-05 18:40:57 +0000760 l->_CosCutoff = 0.0; /* KW: -ve values not admitted */
jtgafb833d1999-08-19 00:55:39 +0000761 l->ConstantAttenuation = 1.0;
762 l->LinearAttenuation = 0.0;
763 l->QuadraticAttenuation = 0.0;
764 l->Enabled = GL_FALSE;
765}
766
767
768
Brian Paul178a1c52000-04-22 01:05:00 +0000769static void
770init_lightmodel( struct gl_lightmodel *lm )
jtgafb833d1999-08-19 00:55:39 +0000771{
Brian Paulfde5e2c2001-09-15 18:02:49 +0000772 ASSIGN_4V( lm->Ambient, 0.2F, 0.2F, 0.2F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000773 lm->LocalViewer = GL_FALSE;
774 lm->TwoSide = GL_FALSE;
775 lm->ColorControl = GL_SINGLE_COLOR;
776}
777
778
Brian Paul178a1c52000-04-22 01:05:00 +0000779static void
780init_material( struct gl_material *m )
jtgafb833d1999-08-19 00:55:39 +0000781{
Brian Paulfde5e2c2001-09-15 18:02:49 +0000782 ASSIGN_4V( m->Ambient, 0.2F, 0.2F, 0.2F, 1.0F );
783 ASSIGN_4V( m->Diffuse, 0.8F, 0.8F, 0.8F, 1.0F );
784 ASSIGN_4V( m->Specular, 0.0F, 0.0F, 0.0F, 1.0F );
785 ASSIGN_4V( m->Emission, 0.0F, 0.0F, 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000786 m->Shininess = 0.0;
787 m->AmbientIndex = 0;
788 m->DiffuseIndex = 1;
789 m->SpecularIndex = 1;
790}
791
792
793
Brian Paul178a1c52000-04-22 01:05:00 +0000794static void
795init_texture_unit( GLcontext *ctx, GLuint unit )
jtgafb833d1999-08-19 00:55:39 +0000796{
797 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
798
799 texUnit->EnvMode = GL_MODULATE;
Brian Paul24507ff2000-06-27 21:42:13 +0000800 texUnit->CombineModeRGB = GL_MODULATE;
801 texUnit->CombineModeA = GL_MODULATE;
802 texUnit->CombineSourceRGB[0] = GL_TEXTURE;
803 texUnit->CombineSourceRGB[1] = GL_PREVIOUS_EXT;
804 texUnit->CombineSourceRGB[2] = GL_CONSTANT_EXT;
805 texUnit->CombineSourceA[0] = GL_TEXTURE;
806 texUnit->CombineSourceA[1] = GL_PREVIOUS_EXT;
807 texUnit->CombineSourceA[2] = GL_CONSTANT_EXT;
808 texUnit->CombineOperandRGB[0] = GL_SRC_COLOR;
809 texUnit->CombineOperandRGB[1] = GL_SRC_COLOR;
810 texUnit->CombineOperandRGB[2] = GL_SRC_ALPHA;
811 texUnit->CombineOperandA[0] = GL_SRC_ALPHA;
812 texUnit->CombineOperandA[1] = GL_SRC_ALPHA;
813 texUnit->CombineOperandA[2] = GL_SRC_ALPHA;
814 texUnit->CombineScaleShiftRGB = 0;
815 texUnit->CombineScaleShiftA = 0;
816
jtgafb833d1999-08-19 00:55:39 +0000817 ASSIGN_4V( texUnit->EnvColor, 0.0, 0.0, 0.0, 0.0 );
818 texUnit->TexGenEnabled = 0;
819 texUnit->GenModeS = GL_EYE_LINEAR;
820 texUnit->GenModeT = GL_EYE_LINEAR;
821 texUnit->GenModeR = GL_EYE_LINEAR;
822 texUnit->GenModeQ = GL_EYE_LINEAR;
Keith Whitwell14940c42000-11-05 18:40:57 +0000823 texUnit->_GenBitS = TEXGEN_EYE_LINEAR;
824 texUnit->_GenBitT = TEXGEN_EYE_LINEAR;
825 texUnit->_GenBitR = TEXGEN_EYE_LINEAR;
826 texUnit->_GenBitQ = TEXGEN_EYE_LINEAR;
Brian Paul26f3b052000-07-19 20:58:59 +0000827
jtgafb833d1999-08-19 00:55:39 +0000828 /* Yes, these plane coefficients are correct! */
829 ASSIGN_4V( texUnit->ObjectPlaneS, 1.0, 0.0, 0.0, 0.0 );
830 ASSIGN_4V( texUnit->ObjectPlaneT, 0.0, 1.0, 0.0, 0.0 );
831 ASSIGN_4V( texUnit->ObjectPlaneR, 0.0, 0.0, 0.0, 0.0 );
832 ASSIGN_4V( texUnit->ObjectPlaneQ, 0.0, 0.0, 0.0, 0.0 );
833 ASSIGN_4V( texUnit->EyePlaneS, 1.0, 0.0, 0.0, 0.0 );
834 ASSIGN_4V( texUnit->EyePlaneT, 0.0, 1.0, 0.0, 0.0 );
835 ASSIGN_4V( texUnit->EyePlaneR, 0.0, 0.0, 0.0, 0.0 );
836 ASSIGN_4V( texUnit->EyePlaneQ, 0.0, 0.0, 0.0, 0.0 );
837
Brian Paula8523782000-11-19 23:10:25 +0000838 texUnit->Current1D = ctx->Shared->Default1D;
839 texUnit->Current2D = ctx->Shared->Default2D;
840 texUnit->Current3D = ctx->Shared->Default3D;
Brian Paul413d6a22000-05-26 14:44:59 +0000841 texUnit->CurrentCubeMap = ctx->Shared->DefaultCubeMap;
jtgafb833d1999-08-19 00:55:39 +0000842}
843
844
jtgafb833d1999-08-19 00:55:39 +0000845
Brian Paul4d053dd2000-01-14 04:45:47 +0000846
jtgafb833d1999-08-19 00:55:39 +0000847/* Initialize a 1-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000848static void
849init_1d_map( struct gl_1d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000850{
851 map->Order = 1;
852 map->u1 = 0.0;
853 map->u2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000854 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000855 if (map->Points) {
856 GLint i;
857 for (i=0;i<n;i++)
858 map->Points[i] = initial[i];
859 }
jtgafb833d1999-08-19 00:55:39 +0000860}
861
862
863/* Initialize a 2-D evaluator map */
Brian Paul178a1c52000-04-22 01:05:00 +0000864static void
865init_2d_map( struct gl_2d_map *map, int n, const float *initial )
jtgafb833d1999-08-19 00:55:39 +0000866{
867 map->Uorder = 1;
868 map->Vorder = 1;
869 map->u1 = 0.0;
870 map->u2 = 1.0;
871 map->v1 = 0.0;
872 map->v2 = 1.0;
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000873 map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000874 if (map->Points) {
875 GLint i;
876 for (i=0;i<n;i++)
877 map->Points[i] = initial[i];
878 }
jtgafb833d1999-08-19 00:55:39 +0000879}
880
881
jtgafb833d1999-08-19 00:55:39 +0000882/*
Brian Paul4d053dd2000-01-14 04:45:47 +0000883 * Initialize the attribute groups in a GLcontext.
jtgafb833d1999-08-19 00:55:39 +0000884 */
Brian Paul178a1c52000-04-22 01:05:00 +0000885static void
886init_attrib_groups( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000887{
Brian Paul30f51ae2001-12-18 04:06:44 +0000888 GLuint i;
jtgafb833d1999-08-19 00:55:39 +0000889
Brian Paul4d053dd2000-01-14 04:45:47 +0000890 assert(ctx);
jtgafb833d1999-08-19 00:55:39 +0000891
Brian Paulcd1cefa2001-06-13 14:56:14 +0000892 assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);
893 assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);
894
Brian Paul539cce52000-02-03 19:40:07 +0000895 /* Constants, may be overriden by device drivers */
Brian Paul4d053dd2000-01-14 04:45:47 +0000896 ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
Brian Paulcd1cefa2001-06-13 14:56:14 +0000897 ctx->Const.Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS;
898 ctx->Const.MaxCubeTextureLevels = MAX_CUBE_TEXTURE_LEVELS;
Brian Paul4d053dd2000-01-14 04:45:47 +0000899 ctx->Const.MaxTextureUnits = MAX_TEXTURE_UNITS;
Gareth Hughes2c3d34c2001-03-18 08:53:49 +0000900 ctx->Const.MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY;
Brian Paul87c964d2001-11-06 15:53:00 +0000901 ctx->Const.MaxTextureLodBias = MAX_TEXTURE_LOD_BIAS;
Brian Paul4d053dd2000-01-14 04:45:47 +0000902 ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
Brian Paul539cce52000-02-03 19:40:07 +0000903 ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
904 ctx->Const.MinPointSize = MIN_POINT_SIZE;
905 ctx->Const.MaxPointSize = MAX_POINT_SIZE;
906 ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
907 ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
Brian Paulfde5e2c2001-09-15 18:02:49 +0000908 ctx->Const.PointSizeGranularity = (GLfloat) POINT_SIZE_GRANULARITY;
Brian Paul539cce52000-02-03 19:40:07 +0000909 ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
910 ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
911 ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
912 ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
Brian Paulfde5e2c2001-09-15 18:02:49 +0000913 ctx->Const.LineWidthGranularity = (GLfloat) LINE_WIDTH_GRANULARITY;
Brian Paul539cce52000-02-03 19:40:07 +0000914 ctx->Const.NumAuxBuffers = NUM_AUX_BUFFERS;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000915 ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
Brian Paul82b02f02000-05-07 20:37:40 +0000916 ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
917 ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
Brian Paul1207bf02000-05-23 20:10:49 +0000918 ctx->Const.NumCompressedTextureFormats = 0;
Brian Paula8644322000-11-27 18:22:13 +0000919 ctx->Const.MaxClipPlanes = MAX_CLIP_PLANES;
920 ctx->Const.MaxLights = MAX_LIGHTS;
jtgafb833d1999-08-19 00:55:39 +0000921
Brian Paul30f51ae2001-12-18 04:06:44 +0000922 /* Initialize matrix stacks */
923 init_matrix_stack(&ctx->ModelviewMatrixStack, MAX_MODELVIEW_STACK_DEPTH,
924 _NEW_MODELVIEW);
925 init_matrix_stack(&ctx->ProjectionMatrixStack, MAX_PROJECTION_STACK_DEPTH,
926 _NEW_PROJECTION);
927 init_matrix_stack(&ctx->ColorMatrixStack, MAX_COLOR_STACK_DEPTH,
928 _NEW_COLOR_MATRIX);
929 for (i = 0; i < MAX_TEXTURE_UNITS; i++)
930 init_matrix_stack(&ctx->TextureMatrixStack[i], MAX_TEXTURE_STACK_DEPTH,
931 _NEW_TEXTURE_MATRIX);
932 for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
933 init_matrix_stack(&ctx->ProgramMatrixStack[i], MAX_PROGRAM_STACK_DEPTH,
934 _NEW_TRACK_MATRIX);
935 ctx->CurrentStack = &ctx->ModelviewMatrixStack;
Brian Paul4d053dd2000-01-14 04:45:47 +0000936
Brian Paul30f51ae2001-12-18 04:06:44 +0000937 /* Init combined Modelview*Projection matrix */
Keith Whitwell23caf202000-11-16 21:05:34 +0000938 _math_matrix_ctr( &ctx->_ModelProjectMatrix );
939
Brian Paul4d053dd2000-01-14 04:45:47 +0000940 /* Accumulate buffer group */
941 ASSIGN_4V( ctx->Accum.ClearColor, 0.0, 0.0, 0.0, 0.0 );
jtgafb833d1999-08-19 00:55:39 +0000942
Brian Paul4d053dd2000-01-14 04:45:47 +0000943 /* Color buffer group */
944 ctx->Color.IndexMask = 0xffffffff;
945 ctx->Color.ColorMask[0] = 0xff;
946 ctx->Color.ColorMask[1] = 0xff;
947 ctx->Color.ColorMask[2] = 0xff;
948 ctx->Color.ColorMask[3] = 0xff;
Brian Paul4d053dd2000-01-14 04:45:47 +0000949 ctx->Color.ClearIndex = 0;
Brian Paul74b493a2001-01-24 00:04:58 +0000950 ASSIGN_4V( ctx->Color.ClearColor, 0, 0, 0, 0 );
Brian Paul4d053dd2000-01-14 04:45:47 +0000951 ctx->Color.DrawBuffer = GL_FRONT;
952 ctx->Color.AlphaEnabled = GL_FALSE;
953 ctx->Color.AlphaFunc = GL_ALWAYS;
954 ctx->Color.AlphaRef = 0;
955 ctx->Color.BlendEnabled = GL_FALSE;
956 ctx->Color.BlendSrcRGB = GL_ONE;
957 ctx->Color.BlendDstRGB = GL_ZERO;
958 ctx->Color.BlendSrcA = GL_ONE;
959 ctx->Color.BlendDstA = GL_ZERO;
960 ctx->Color.BlendEquation = GL_FUNC_ADD_EXT;
Brian Paul4d053dd2000-01-14 04:45:47 +0000961 ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 );
962 ctx->Color.IndexLogicOpEnabled = GL_FALSE;
963 ctx->Color.ColorLogicOpEnabled = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000964 ctx->Color.LogicOp = GL_COPY;
965 ctx->Color.DitherFlag = GL_TRUE;
966 ctx->Color.MultiDrawBuffer = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000967
Brian Paul4d053dd2000-01-14 04:45:47 +0000968 /* Current group */
Brian Paul86b84272001-12-14 02:50:01 +0000969 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_WEIGHT], 0.0, 0.0, 0.0, 0.0 );
970 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 0.0 );
971 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 );
972 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR1], 0.0, 0.0, 0.0, 0.0 );
973 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_FOG], 0.0, 0.0, 0.0, 0.0 );
974 for (i = 0; i < MAX_TEXTURE_UNITS; i++)
975 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_TEX0 + i], 0.0, 0.0, 0.0, 1.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +0000976 ctx->Current.Index = 1;
Brian Paul86b84272001-12-14 02:50:01 +0000977 ctx->Current.EdgeFlag = GL_TRUE;
978
Brian Paul4d053dd2000-01-14 04:45:47 +0000979 ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
980 ctx->Current.RasterDistance = 0.0;
981 ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
982 ctx->Current.RasterIndex = 1;
983 for (i=0; i<MAX_TEXTURE_UNITS; i++)
Brian Paul002483e2002-05-09 21:54:16 +0000984 ASSIGN_4V( ctx->Current.RasterTexCoords[i], 0.0, 0.0, 0.0, 1.0 );
Brian Paul4d053dd2000-01-14 04:45:47 +0000985 ctx->Current.RasterPosValid = GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +0000986
jtgafb833d1999-08-19 00:55:39 +0000987
Brian Paul4d053dd2000-01-14 04:45:47 +0000988 /* Depth buffer group */
989 ctx->Depth.Test = GL_FALSE;
990 ctx->Depth.Clear = 1.0;
991 ctx->Depth.Func = GL_LESS;
992 ctx->Depth.Mask = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +0000993 ctx->Depth.OcclusionTest = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000994
Brian Paul4d053dd2000-01-14 04:45:47 +0000995 /* Evaluators group */
996 ctx->Eval.Map1Color4 = GL_FALSE;
997 ctx->Eval.Map1Index = GL_FALSE;
998 ctx->Eval.Map1Normal = GL_FALSE;
999 ctx->Eval.Map1TextureCoord1 = GL_FALSE;
1000 ctx->Eval.Map1TextureCoord2 = GL_FALSE;
1001 ctx->Eval.Map1TextureCoord3 = GL_FALSE;
1002 ctx->Eval.Map1TextureCoord4 = GL_FALSE;
1003 ctx->Eval.Map1Vertex3 = GL_FALSE;
1004 ctx->Eval.Map1Vertex4 = GL_FALSE;
Brian Paulbc42c192002-01-05 21:53:20 +00001005 MEMSET(ctx->Eval.Map1Attrib, 0, sizeof(ctx->Eval.Map1Attrib));
Brian Paul4d053dd2000-01-14 04:45:47 +00001006 ctx->Eval.Map2Color4 = GL_FALSE;
1007 ctx->Eval.Map2Index = GL_FALSE;
1008 ctx->Eval.Map2Normal = GL_FALSE;
1009 ctx->Eval.Map2TextureCoord1 = GL_FALSE;
1010 ctx->Eval.Map2TextureCoord2 = GL_FALSE;
1011 ctx->Eval.Map2TextureCoord3 = GL_FALSE;
1012 ctx->Eval.Map2TextureCoord4 = GL_FALSE;
1013 ctx->Eval.Map2Vertex3 = GL_FALSE;
1014 ctx->Eval.Map2Vertex4 = GL_FALSE;
Brian Paulbc42c192002-01-05 21:53:20 +00001015 MEMSET(ctx->Eval.Map2Attrib, 0, sizeof(ctx->Eval.Map2Attrib));
Brian Paul4d053dd2000-01-14 04:45:47 +00001016 ctx->Eval.AutoNormal = GL_FALSE;
1017 ctx->Eval.MapGrid1un = 1;
1018 ctx->Eval.MapGrid1u1 = 0.0;
1019 ctx->Eval.MapGrid1u2 = 1.0;
1020 ctx->Eval.MapGrid2un = 1;
1021 ctx->Eval.MapGrid2vn = 1;
1022 ctx->Eval.MapGrid2u1 = 0.0;
1023 ctx->Eval.MapGrid2u2 = 1.0;
1024 ctx->Eval.MapGrid2v1 = 0.0;
1025 ctx->Eval.MapGrid2v2 = 1.0;
jtgafb833d1999-08-19 00:55:39 +00001026
Brian Paul4d053dd2000-01-14 04:45:47 +00001027 /* Evaluator data */
1028 {
1029 static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
1030 static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
1031 static GLfloat index[1] = { 1.0 };
1032 static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
1033 static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
Brian Paulbc42c192002-01-05 21:53:20 +00001034 static GLfloat attrib[4] = { 0.0, 0.0, 0.0, 1.0 };
jtgafb833d1999-08-19 00:55:39 +00001035
Brian Paul4d053dd2000-01-14 04:45:47 +00001036 init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
1037 init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
1038 init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
1039 init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
1040 init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
1041 init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
1042 init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
1043 init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
1044 init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
Brian Paulbc42c192002-01-05 21:53:20 +00001045 for (i = 0; i < 16; i++)
1046 init_1d_map( ctx->EvalMap.Map1Attrib + i, 4, attrib );
jtgafb833d1999-08-19 00:55:39 +00001047
Brian Paul4d053dd2000-01-14 04:45:47 +00001048 init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
1049 init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
1050 init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
1051 init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
1052 init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
1053 init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
1054 init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
1055 init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
1056 init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
Brian Paulbc42c192002-01-05 21:53:20 +00001057 for (i = 0; i < 16; i++)
1058 init_2d_map( ctx->EvalMap.Map2Attrib + i, 4, attrib );
Brian Paul4d053dd2000-01-14 04:45:47 +00001059 }
jtgafb833d1999-08-19 00:55:39 +00001060
Brian Paul4d053dd2000-01-14 04:45:47 +00001061 /* Fog group */
1062 ctx->Fog.Enabled = GL_FALSE;
1063 ctx->Fog.Mode = GL_EXP;
1064 ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
1065 ctx->Fog.Index = 0.0;
1066 ctx->Fog.Density = 1.0;
1067 ctx->Fog.Start = 0.0;
1068 ctx->Fog.End = 1.0;
Keith Whitwellfe5d67d2000-10-27 16:44:40 +00001069 ctx->Fog.ColorSumEnabled = GL_FALSE;
1070 ctx->Fog.FogCoordinateSource = GL_FRAGMENT_DEPTH_EXT;
jtgafb833d1999-08-19 00:55:39 +00001071
Brian Paul4d053dd2000-01-14 04:45:47 +00001072 /* Hint group */
1073 ctx->Hint.PerspectiveCorrection = GL_DONT_CARE;
1074 ctx->Hint.PointSmooth = GL_DONT_CARE;
1075 ctx->Hint.LineSmooth = GL_DONT_CARE;
1076 ctx->Hint.PolygonSmooth = GL_DONT_CARE;
1077 ctx->Hint.Fog = GL_DONT_CARE;
Brian Paul1207bf02000-05-23 20:10:49 +00001078 ctx->Hint.ClipVolumeClipping = GL_DONT_CARE;
1079 ctx->Hint.TextureCompression = GL_DONT_CARE;
Brian Paul3893e632001-05-21 16:41:03 +00001080 ctx->Hint.GenerateMipmap = GL_DONT_CARE;
jtgafb833d1999-08-19 00:55:39 +00001081
Brian Paul0771d152000-04-07 00:19:41 +00001082 /* Histogram group */
1083 ctx->Histogram.Width = 0;
1084 ctx->Histogram.Format = GL_RGBA;
1085 ctx->Histogram.Sink = GL_FALSE;
Brian Paule75d2422001-02-17 18:41:01 +00001086 ctx->Histogram.RedSize = 0;
1087 ctx->Histogram.GreenSize = 0;
1088 ctx->Histogram.BlueSize = 0;
1089 ctx->Histogram.AlphaSize = 0;
1090 ctx->Histogram.LuminanceSize = 0;
Brian Paul0771d152000-04-07 00:19:41 +00001091 for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
1092 ctx->Histogram.Count[i][0] = 0;
1093 ctx->Histogram.Count[i][1] = 0;
1094 ctx->Histogram.Count[i][2] = 0;
1095 ctx->Histogram.Count[i][3] = 0;
1096 }
1097
1098 /* Min/Max group */
1099 ctx->MinMax.Format = GL_RGBA;
1100 ctx->MinMax.Sink = GL_FALSE;
1101 ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000;
1102 ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000;
1103 ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000;
1104 ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000;
1105
Brian Paul4d053dd2000-01-14 04:45:47 +00001106 /* Extensions */
Brian Paul69755402001-02-26 23:58:12 +00001107 _mesa_extensions_ctr( ctx );
jtgafb833d1999-08-19 00:55:39 +00001108
Brian Paul4d053dd2000-01-14 04:45:47 +00001109 /* Lighting group */
1110 for (i=0;i<MAX_LIGHTS;i++) {
1111 init_light( &ctx->Light.Light[i], i );
1112 }
1113 make_empty_list( &ctx->Light.EnabledList );
jtgafb833d1999-08-19 00:55:39 +00001114
Brian Paul4d053dd2000-01-14 04:45:47 +00001115 init_lightmodel( &ctx->Light.Model );
1116 init_material( &ctx->Light.Material[0] );
1117 init_material( &ctx->Light.Material[1] );
1118 ctx->Light.ShadeModel = GL_SMOOTH;
1119 ctx->Light.Enabled = GL_FALSE;
1120 ctx->Light.ColorMaterialFace = GL_FRONT_AND_BACK;
1121 ctx->Light.ColorMaterialMode = GL_AMBIENT_AND_DIFFUSE;
Brian Paul08836342001-03-03 20:33:27 +00001122 ctx->Light.ColorMaterialBitmask = _mesa_material_bitmask( ctx,
1123 GL_FRONT_AND_BACK,
1124 GL_AMBIENT_AND_DIFFUSE, ~0, 0 );
jtgafb833d1999-08-19 00:55:39 +00001125
Brian Paul4d053dd2000-01-14 04:45:47 +00001126 ctx->Light.ColorMaterialEnabled = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001127
Brian Paul4d053dd2000-01-14 04:45:47 +00001128 /* Lighting miscellaneous */
Keith Whitwell14940c42000-11-05 18:40:57 +00001129 ctx->_ShineTabList = MALLOC_STRUCT( gl_shine_tab );
1130 make_empty_list( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00001131 for (i = 0 ; i < 10 ; i++) {
1132 struct gl_shine_tab *s = MALLOC_STRUCT( gl_shine_tab );
1133 s->shininess = -1;
1134 s->refcount = 0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001135 insert_at_tail( ctx->_ShineTabList, s );
Brian Paul4d053dd2000-01-14 04:45:47 +00001136 }
Brian Paul77d61af2000-06-28 04:20:21 +00001137
jtgafb833d1999-08-19 00:55:39 +00001138
Brian Paul4d053dd2000-01-14 04:45:47 +00001139 /* Line group */
1140 ctx->Line.SmoothFlag = GL_FALSE;
1141 ctx->Line.StippleFlag = GL_FALSE;
1142 ctx->Line.Width = 1.0;
Keith Whitwellbed4c5b2001-02-27 16:14:35 +00001143 ctx->Line._Width = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001144 ctx->Line.StipplePattern = 0xffff;
1145 ctx->Line.StippleFactor = 1;
jtgafb833d1999-08-19 00:55:39 +00001146
Brian Paul4d053dd2000-01-14 04:45:47 +00001147 /* Display List group */
1148 ctx->List.ListBase = 0;
jtgafb833d1999-08-19 00:55:39 +00001149
Brian Paul736fcbe2001-05-29 15:23:48 +00001150 /* Multisample */
1151 ctx->Multisample.Enabled = GL_FALSE;
1152 ctx->Multisample.SampleAlphaToCoverage = GL_FALSE;
1153 ctx->Multisample.SampleAlphaToOne = GL_FALSE;
1154 ctx->Multisample.SampleCoverage = GL_FALSE;
1155 ctx->Multisample.SampleCoverageValue = 1.0;
1156 ctx->Multisample.SampleCoverageInvert = GL_FALSE;
1157
Brian Paul4d053dd2000-01-14 04:45:47 +00001158 /* Pixel group */
1159 ctx->Pixel.RedBias = 0.0;
1160 ctx->Pixel.RedScale = 1.0;
1161 ctx->Pixel.GreenBias = 0.0;
1162 ctx->Pixel.GreenScale = 1.0;
1163 ctx->Pixel.BlueBias = 0.0;
1164 ctx->Pixel.BlueScale = 1.0;
1165 ctx->Pixel.AlphaBias = 0.0;
1166 ctx->Pixel.AlphaScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001167 ctx->Pixel.DepthBias = 0.0;
1168 ctx->Pixel.DepthScale = 1.0;
1169 ctx->Pixel.IndexOffset = 0;
1170 ctx->Pixel.IndexShift = 0;
1171 ctx->Pixel.ZoomX = 1.0;
1172 ctx->Pixel.ZoomY = 1.0;
1173 ctx->Pixel.MapColorFlag = GL_FALSE;
1174 ctx->Pixel.MapStencilFlag = GL_FALSE;
1175 ctx->Pixel.MapStoSsize = 1;
1176 ctx->Pixel.MapItoIsize = 1;
1177 ctx->Pixel.MapItoRsize = 1;
1178 ctx->Pixel.MapItoGsize = 1;
1179 ctx->Pixel.MapItoBsize = 1;
1180 ctx->Pixel.MapItoAsize = 1;
1181 ctx->Pixel.MapRtoRsize = 1;
1182 ctx->Pixel.MapGtoGsize = 1;
1183 ctx->Pixel.MapBtoBsize = 1;
1184 ctx->Pixel.MapAtoAsize = 1;
1185 ctx->Pixel.MapStoS[0] = 0;
1186 ctx->Pixel.MapItoI[0] = 0;
1187 ctx->Pixel.MapItoR[0] = 0.0;
1188 ctx->Pixel.MapItoG[0] = 0.0;
1189 ctx->Pixel.MapItoB[0] = 0.0;
1190 ctx->Pixel.MapItoA[0] = 0.0;
1191 ctx->Pixel.MapItoR8[0] = 0;
1192 ctx->Pixel.MapItoG8[0] = 0;
1193 ctx->Pixel.MapItoB8[0] = 0;
1194 ctx->Pixel.MapItoA8[0] = 0;
1195 ctx->Pixel.MapRtoR[0] = 0.0;
1196 ctx->Pixel.MapGtoG[0] = 0.0;
1197 ctx->Pixel.MapBtoB[0] = 0.0;
1198 ctx->Pixel.MapAtoA[0] = 0.0;
Brian Paul2b2e9252000-04-07 16:27:26 +00001199 ctx->Pixel.HistogramEnabled = GL_FALSE;
1200 ctx->Pixel.MinMaxEnabled = GL_FALSE;
1201 ctx->Pixel.PixelTextureEnabled = GL_FALSE;
1202 ctx->Pixel.FragmentRgbSource = GL_PIXEL_GROUP_COLOR_SGIS;
1203 ctx->Pixel.FragmentAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS;
Brian Paul82b02f02000-05-07 20:37:40 +00001204 ASSIGN_4V(ctx->Pixel.PostColorMatrixScale, 1.0, 1.0, 1.0, 1.0);
1205 ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0);
1206 ASSIGN_4V(ctx->Pixel.ColorTableScale, 1.0, 1.0, 1.0, 1.0);
1207 ASSIGN_4V(ctx->Pixel.ColorTableBias, 0.0, 0.0, 0.0, 0.0);
Brian Paul6c50e162000-06-30 22:11:04 +00001208 ASSIGN_4V(ctx->Pixel.PCCTscale, 1.0, 1.0, 1.0, 1.0);
1209 ASSIGN_4V(ctx->Pixel.PCCTbias, 0.0, 0.0, 0.0, 0.0);
1210 ASSIGN_4V(ctx->Pixel.PCMCTscale, 1.0, 1.0, 1.0, 1.0);
1211 ASSIGN_4V(ctx->Pixel.PCMCTbias, 0.0, 0.0, 0.0, 0.0);
Brian Paul4fe34b22000-04-11 15:07:48 +00001212 ctx->Pixel.ColorTableEnabled = GL_FALSE;
1213 ctx->Pixel.PostConvolutionColorTableEnabled = GL_FALSE;
1214 ctx->Pixel.PostColorMatrixColorTableEnabled = GL_FALSE;
Brian Paul82b02f02000-05-07 20:37:40 +00001215 ctx->Pixel.Convolution1DEnabled = GL_FALSE;
1216 ctx->Pixel.Convolution2DEnabled = GL_FALSE;
1217 ctx->Pixel.Separable2DEnabled = GL_FALSE;
1218 for (i = 0; i < 3; i++) {
1219 ASSIGN_4V(ctx->Pixel.ConvolutionBorderColor[i], 0.0, 0.0, 0.0, 0.0);
1220 ctx->Pixel.ConvolutionBorderMode[i] = GL_REDUCE;
1221 ASSIGN_4V(ctx->Pixel.ConvolutionFilterScale[i], 1.0, 1.0, 1.0, 1.0);
1222 ASSIGN_4V(ctx->Pixel.ConvolutionFilterBias[i], 0.0, 0.0, 0.0, 0.0);
1223 }
Brian Paul67adba12000-12-09 20:35:54 +00001224 for (i = 0; i < MAX_CONVOLUTION_WIDTH * MAX_CONVOLUTION_WIDTH * 4; i++) {
1225 ctx->Convolution1D.Filter[i] = 0.0;
1226 ctx->Convolution2D.Filter[i] = 0.0;
1227 ctx->Separable2D.Filter[i] = 0.0;
1228 }
Brian Paul82b02f02000-05-07 20:37:40 +00001229 ASSIGN_4V(ctx->Pixel.PostConvolutionScale, 1.0, 1.0, 1.0, 1.0);
1230 ASSIGN_4V(ctx->Pixel.PostConvolutionBias, 0.0, 0.0, 0.0, 0.0);
jtgafb833d1999-08-19 00:55:39 +00001231
Brian Paul4d053dd2000-01-14 04:45:47 +00001232 /* Point group */
1233 ctx->Point.SmoothFlag = GL_FALSE;
1234 ctx->Point.Size = 1.0;
Brian Paul24a32622000-11-15 16:38:40 +00001235 ctx->Point._Size = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001236 ctx->Point.Params[0] = 1.0;
1237 ctx->Point.Params[1] = 0.0;
1238 ctx->Point.Params[2] = 0.0;
Keith Whitwell14940c42000-11-05 18:40:57 +00001239 ctx->Point._Attenuated = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001240 ctx->Point.MinSize = 0.0;
Brian Paul24a32622000-11-15 16:38:40 +00001241 ctx->Point.MaxSize = ctx->Const.MaxPointSize;
Brian Paul4d053dd2000-01-14 04:45:47 +00001242 ctx->Point.Threshold = 1.0;
Brian Paul6c408b42002-05-27 17:04:52 +00001243 ctx->Point.PointSprite = GL_FALSE; /* GL_NV_point_sprite */
1244 ctx->Point.SpriteRMode = GL_ZERO; /* GL_NV_point_sprite */
1245 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
1246 ctx->Point.CoordReplace[i] = GL_FALSE; /* GL_NV_point_sprite */
1247 }
jtgafb833d1999-08-19 00:55:39 +00001248
Brian Paul4d053dd2000-01-14 04:45:47 +00001249 /* Polygon group */
1250 ctx->Polygon.CullFlag = GL_FALSE;
1251 ctx->Polygon.CullFaceMode = GL_BACK;
1252 ctx->Polygon.FrontFace = GL_CCW;
Keith Whitwellcab974c2000-12-26 05:09:27 +00001253 ctx->Polygon._FrontBit = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001254 ctx->Polygon.FrontMode = GL_FILL;
1255 ctx->Polygon.BackMode = GL_FILL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001256 ctx->Polygon.SmoothFlag = GL_FALSE;
1257 ctx->Polygon.StippleFlag = GL_FALSE;
1258 ctx->Polygon.OffsetFactor = 0.0F;
1259 ctx->Polygon.OffsetUnits = 0.0F;
Brian Pauld0d7d622000-10-21 00:02:47 +00001260 ctx->Polygon.OffsetMRD = 0.0F;
Brian Paul4d053dd2000-01-14 04:45:47 +00001261 ctx->Polygon.OffsetPoint = GL_FALSE;
1262 ctx->Polygon.OffsetLine = GL_FALSE;
1263 ctx->Polygon.OffsetFill = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001264
Brian Paul4d053dd2000-01-14 04:45:47 +00001265 /* Polygon Stipple group */
1266 MEMSET( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) );
jtgafb833d1999-08-19 00:55:39 +00001267
Brian Paul4d053dd2000-01-14 04:45:47 +00001268 /* Scissor group */
1269 ctx->Scissor.Enabled = GL_FALSE;
1270 ctx->Scissor.X = 0;
1271 ctx->Scissor.Y = 0;
1272 ctx->Scissor.Width = 0;
1273 ctx->Scissor.Height = 0;
jtgafb833d1999-08-19 00:55:39 +00001274
Brian Paul4d053dd2000-01-14 04:45:47 +00001275 /* Stencil group */
1276 ctx->Stencil.Enabled = GL_FALSE;
1277 ctx->Stencil.Function = GL_ALWAYS;
1278 ctx->Stencil.FailFunc = GL_KEEP;
1279 ctx->Stencil.ZPassFunc = GL_KEEP;
1280 ctx->Stencil.ZFailFunc = GL_KEEP;
1281 ctx->Stencil.Ref = 0;
1282 ctx->Stencil.ValueMask = STENCIL_MAX;
1283 ctx->Stencil.Clear = 0;
1284 ctx->Stencil.WriteMask = STENCIL_MAX;
jtgafb833d1999-08-19 00:55:39 +00001285
Brian Paul4d053dd2000-01-14 04:45:47 +00001286 /* Texture group */
1287 ctx->Texture.CurrentUnit = 0; /* multitexture */
Keith Whitwell14940c42000-11-05 18:40:57 +00001288 ctx->Texture._ReallyEnabled = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001289 for (i=0; i<MAX_TEXTURE_UNITS; i++)
1290 init_texture_unit( ctx, i );
Brian Paul23316032000-09-14 23:13:23 +00001291 ctx->Texture.SharedPalette = GL_FALSE;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001292 _mesa_init_colortable(&ctx->Texture.Palette);
jtgafb833d1999-08-19 00:55:39 +00001293
Brian Paul4d053dd2000-01-14 04:45:47 +00001294 /* Transformation group */
1295 ctx->Transform.MatrixMode = GL_MODELVIEW;
1296 ctx->Transform.Normalize = GL_FALSE;
1297 ctx->Transform.RescaleNormals = GL_FALSE;
Brian Paul8c2f6c52001-06-26 01:32:48 +00001298 ctx->Transform.RasterPositionUnclipped = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001299 for (i=0;i<MAX_CLIP_PLANES;i++) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001300 ASSIGN_4V( ctx->Transform.EyeUserPlane[i], 0.0, 0.0, 0.0, 0.0 );
1301 }
Brian Paul103bc0f2002-03-29 17:27:59 +00001302 ctx->Transform.ClipPlanesEnabled = 0;
jtgafb833d1999-08-19 00:55:39 +00001303
Brian Paul4d053dd2000-01-14 04:45:47 +00001304 /* Viewport group */
1305 ctx->Viewport.X = 0;
1306 ctx->Viewport.Y = 0;
1307 ctx->Viewport.Width = 0;
1308 ctx->Viewport.Height = 0;
1309 ctx->Viewport.Near = 0.0;
1310 ctx->Viewport.Far = 1.0;
Keith Whitwell23caf202000-11-16 21:05:34 +00001311 _math_matrix_ctr(&ctx->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00001312
1313#define Sz 10
1314#define Tz 14
Brian Paulfde5e2c2001-09-15 18:02:49 +00001315 ctx->Viewport._WindowMap.m[Sz] = 0.5F * ctx->DepthMaxF;
1316 ctx->Viewport._WindowMap.m[Tz] = 0.5F * ctx->DepthMaxF;
jtgafb833d1999-08-19 00:55:39 +00001317#undef Sz
1318#undef Tz
1319
Keith Whitwell14940c42000-11-05 18:40:57 +00001320 ctx->Viewport._WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION;
1321 ctx->Viewport._WindowMap.type = MATRIX_3D_NO_ROT;
jtgafb833d1999-08-19 00:55:39 +00001322
Brian Paul4d053dd2000-01-14 04:45:47 +00001323 /* Vertex arrays */
1324 ctx->Array.Vertex.Size = 4;
1325 ctx->Array.Vertex.Type = GL_FLOAT;
1326 ctx->Array.Vertex.Stride = 0;
1327 ctx->Array.Vertex.StrideB = 0;
1328 ctx->Array.Vertex.Ptr = NULL;
1329 ctx->Array.Vertex.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001330 ctx->Array.Vertex.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001331 ctx->Array.Normal.Type = GL_FLOAT;
1332 ctx->Array.Normal.Stride = 0;
1333 ctx->Array.Normal.StrideB = 0;
1334 ctx->Array.Normal.Ptr = NULL;
1335 ctx->Array.Normal.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001336 ctx->Array.Normal.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001337 ctx->Array.Color.Size = 4;
1338 ctx->Array.Color.Type = GL_FLOAT;
1339 ctx->Array.Color.Stride = 0;
1340 ctx->Array.Color.StrideB = 0;
1341 ctx->Array.Color.Ptr = NULL;
1342 ctx->Array.Color.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001343 ctx->Array.Color.Flags = CA_CLIENT_DATA;
1344 ctx->Array.SecondaryColor.Size = 4;
1345 ctx->Array.SecondaryColor.Type = GL_FLOAT;
1346 ctx->Array.SecondaryColor.Stride = 0;
1347 ctx->Array.SecondaryColor.StrideB = 0;
1348 ctx->Array.SecondaryColor.Ptr = NULL;
1349 ctx->Array.SecondaryColor.Enabled = GL_FALSE;
1350 ctx->Array.SecondaryColor.Flags = CA_CLIENT_DATA;
1351 ctx->Array.FogCoord.Size = 1;
1352 ctx->Array.FogCoord.Type = GL_FLOAT;
1353 ctx->Array.FogCoord.Stride = 0;
1354 ctx->Array.FogCoord.StrideB = 0;
1355 ctx->Array.FogCoord.Ptr = NULL;
1356 ctx->Array.FogCoord.Enabled = GL_FALSE;
1357 ctx->Array.FogCoord.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001358 ctx->Array.Index.Type = GL_FLOAT;
1359 ctx->Array.Index.Stride = 0;
1360 ctx->Array.Index.StrideB = 0;
1361 ctx->Array.Index.Ptr = NULL;
1362 ctx->Array.Index.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001363 ctx->Array.Index.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001364 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
1365 ctx->Array.TexCoord[i].Size = 4;
1366 ctx->Array.TexCoord[i].Type = GL_FLOAT;
1367 ctx->Array.TexCoord[i].Stride = 0;
1368 ctx->Array.TexCoord[i].StrideB = 0;
1369 ctx->Array.TexCoord[i].Ptr = NULL;
1370 ctx->Array.TexCoord[i].Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001371 ctx->Array.TexCoord[i].Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001372 }
1373 ctx->Array.TexCoordInterleaveFactor = 1;
1374 ctx->Array.EdgeFlag.Stride = 0;
1375 ctx->Array.EdgeFlag.StrideB = 0;
1376 ctx->Array.EdgeFlag.Ptr = NULL;
1377 ctx->Array.EdgeFlag.Enabled = GL_FALSE;
Keith Whitwell51c0c712001-04-28 08:39:17 +00001378 ctx->Array.EdgeFlag.Flags = CA_CLIENT_DATA;
Brian Paul4d053dd2000-01-14 04:45:47 +00001379 ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */
1380
1381 /* Pixel transfer */
1382 ctx->Pack.Alignment = 4;
1383 ctx->Pack.RowLength = 0;
1384 ctx->Pack.ImageHeight = 0;
1385 ctx->Pack.SkipPixels = 0;
1386 ctx->Pack.SkipRows = 0;
1387 ctx->Pack.SkipImages = 0;
1388 ctx->Pack.SwapBytes = GL_FALSE;
1389 ctx->Pack.LsbFirst = GL_FALSE;
1390 ctx->Unpack.Alignment = 4;
1391 ctx->Unpack.RowLength = 0;
1392 ctx->Unpack.ImageHeight = 0;
1393 ctx->Unpack.SkipPixels = 0;
1394 ctx->Unpack.SkipRows = 0;
1395 ctx->Unpack.SkipImages = 0;
1396 ctx->Unpack.SwapBytes = GL_FALSE;
1397 ctx->Unpack.LsbFirst = GL_FALSE;
1398
1399 /* Feedback */
1400 ctx->Feedback.Type = GL_2D; /* TODO: verify */
1401 ctx->Feedback.Buffer = NULL;
1402 ctx->Feedback.BufferSize = 0;
1403 ctx->Feedback.Count = 0;
1404
1405 /* Selection/picking */
1406 ctx->Select.Buffer = NULL;
1407 ctx->Select.BufferSize = 0;
1408 ctx->Select.BufferCount = 0;
1409 ctx->Select.Hits = 0;
1410 ctx->Select.NameStackDepth = 0;
1411
Brian Paul4d053dd2000-01-14 04:45:47 +00001412 /* Renderer and client attribute stacks */
1413 ctx->AttribStackDepth = 0;
1414 ctx->ClientAttribStackDepth = 0;
1415
Brian Paul13811372000-04-12 00:27:37 +00001416 /* Display list */
1417 ctx->CallDepth = 0;
1418 ctx->ExecuteFlag = GL_TRUE;
1419 ctx->CompileFlag = GL_FALSE;
1420 ctx->CurrentListPtr = NULL;
1421 ctx->CurrentBlock = NULL;
1422 ctx->CurrentListNum = 0;
1423 ctx->CurrentPos = 0;
1424
1425 /* Color tables */
Brian Paul4bdcfe52000-04-17 17:57:04 +00001426 _mesa_init_colortable(&ctx->ColorTable);
1427 _mesa_init_colortable(&ctx->ProxyColorTable);
1428 _mesa_init_colortable(&ctx->PostConvolutionColorTable);
1429 _mesa_init_colortable(&ctx->ProxyPostConvolutionColorTable);
1430 _mesa_init_colortable(&ctx->PostColorMatrixColorTable);
1431 _mesa_init_colortable(&ctx->ProxyPostColorMatrixColorTable);
Brian Paul13811372000-04-12 00:27:37 +00001432
Brian Paul86b84272001-12-14 02:50:01 +00001433 /* GL_NV_vertex_program */
Brian Paul30f51ae2001-12-18 04:06:44 +00001434 ctx->VertexProgram.Current = NULL;
1435 ctx->VertexProgram.CurrentID = 0;
Brian Paul86b84272001-12-14 02:50:01 +00001436 ctx->VertexProgram.Enabled = GL_FALSE;
1437 ctx->VertexProgram.PointSizeEnabled = GL_FALSE;
1438 ctx->VertexProgram.TwoSideEnabled = GL_FALSE;
1439 for (i = 0; i < VP_NUM_PROG_REGS / 4; i++) {
1440 ctx->VertexProgram.TrackMatrix[i] = GL_NONE;
1441 ctx->VertexProgram.TrackMatrixTransform[i] = GL_IDENTITY_NV;
1442 }
1443
Brian Paul4d053dd2000-01-14 04:45:47 +00001444 /* Miscellaneous */
Keith Whitwella96308c2000-10-30 13:31:59 +00001445 ctx->NewState = _NEW_ALL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001446 ctx->RenderMode = GL_RENDER;
Keith Whitwell14940c42000-11-05 18:40:57 +00001447 ctx->_ImageTransferState = 0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001448
Keith Whitwell1e1aac02000-11-13 20:02:56 +00001449 ctx->_NeedNormals = 0;
1450 ctx->_NeedEyeCoords = 0;
1451 ctx->_ModelViewInvScale = 1.0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001452
Brian Paul4d053dd2000-01-14 04:45:47 +00001453 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
1454
1455 ctx->CatchSignals = GL_TRUE;
Brian Paul1b2ff692000-03-11 23:23:26 +00001456 ctx->OcclusionResult = GL_FALSE;
Brian Paul7e67fb42000-04-04 15:14:10 +00001457 ctx->OcclusionResultSaved = GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001458
1459 /* For debug/development only */
Brian Paul4753d602002-06-15 02:38:15 +00001460 ctx->NoRaster = ctx->imports.getenv(ctx, "MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001461 ctx->FirstTimeCurrent = GL_TRUE;
1462
1463 /* Dither disable */
Brian Paul4753d602002-06-15 02:38:15 +00001464 ctx->NoDither = ctx->imports.getenv(ctx, "MESA_NO_DITHER") ? GL_TRUE : GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +00001465 if (ctx->NoDither) {
Brian Paul4753d602002-06-15 02:38:15 +00001466 if (ctx->imports.getenv(ctx, "MESA_DEBUG")) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001467 fprintf(stderr, "MESA_NO_DITHER set - dithering disabled\n");
jtgafb833d1999-08-19 00:55:39 +00001468 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001469 ctx->Color.DitherFlag = GL_FALSE;
Brian Paul00037781999-12-17 14:52:35 +00001470 }
1471}
1472
1473
1474
1475
jtgafb833d1999-08-19 00:55:39 +00001476/*
1477 * Allocate the proxy textures. If we run out of memory part way through
1478 * the allocations clean up and return GL_FALSE.
1479 * Return: GL_TRUE=success, GL_FALSE=failure
1480 */
Brian Paul178a1c52000-04-22 01:05:00 +00001481static GLboolean
1482alloc_proxy_textures( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001483{
1484 GLboolean out_of_memory;
1485 GLint i;
1486
Brian Paula8523782000-11-19 23:10:25 +00001487 ctx->Texture.Proxy1D = _mesa_alloc_texture_object(NULL, 0, 1);
jtgafb833d1999-08-19 00:55:39 +00001488 if (!ctx->Texture.Proxy1D) {
1489 return GL_FALSE;
1490 }
1491
Brian Paula8523782000-11-19 23:10:25 +00001492 ctx->Texture.Proxy2D = _mesa_alloc_texture_object(NULL, 0, 2);
jtgafb833d1999-08-19 00:55:39 +00001493 if (!ctx->Texture.Proxy2D) {
Brian Paula8523782000-11-19 23:10:25 +00001494 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
jtgafb833d1999-08-19 00:55:39 +00001495 return GL_FALSE;
1496 }
1497
Brian Paula8523782000-11-19 23:10:25 +00001498 ctx->Texture.Proxy3D = _mesa_alloc_texture_object(NULL, 0, 3);
jtgafb833d1999-08-19 00:55:39 +00001499 if (!ctx->Texture.Proxy3D) {
Brian Paula8523782000-11-19 23:10:25 +00001500 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
1501 _mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
1502 return GL_FALSE;
1503 }
1504
1505 ctx->Texture.ProxyCubeMap = _mesa_alloc_texture_object(NULL, 0, 6);
1506 if (!ctx->Texture.ProxyCubeMap) {
1507 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
1508 _mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
1509 _mesa_free_texture_object(NULL, ctx->Texture.Proxy3D);
jtgafb833d1999-08-19 00:55:39 +00001510 return GL_FALSE;
1511 }
1512
1513 out_of_memory = GL_FALSE;
1514 for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
Brian Paul021a5252000-03-27 17:54:17 +00001515 ctx->Texture.Proxy1D->Image[i] = _mesa_alloc_texture_image();
1516 ctx->Texture.Proxy2D->Image[i] = _mesa_alloc_texture_image();
1517 ctx->Texture.Proxy3D->Image[i] = _mesa_alloc_texture_image();
Brian Paul172281d2001-07-26 20:02:10 +00001518 ctx->Texture.ProxyCubeMap->Image[i] = _mesa_alloc_texture_image();
jtgafb833d1999-08-19 00:55:39 +00001519 if (!ctx->Texture.Proxy1D->Image[i]
1520 || !ctx->Texture.Proxy2D->Image[i]
Brian Paul172281d2001-07-26 20:02:10 +00001521 || !ctx->Texture.Proxy3D->Image[i]
1522 || !ctx->Texture.ProxyCubeMap->Image[i]) {
jtgafb833d1999-08-19 00:55:39 +00001523 out_of_memory = GL_TRUE;
1524 }
1525 }
1526 if (out_of_memory) {
1527 for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
1528 if (ctx->Texture.Proxy1D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001529 _mesa_free_texture_image(ctx->Texture.Proxy1D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001530 }
1531 if (ctx->Texture.Proxy2D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001532 _mesa_free_texture_image(ctx->Texture.Proxy2D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001533 }
1534 if (ctx->Texture.Proxy3D->Image[i]) {
Brian Paul021a5252000-03-27 17:54:17 +00001535 _mesa_free_texture_image(ctx->Texture.Proxy3D->Image[i]);
jtgafb833d1999-08-19 00:55:39 +00001536 }
Brian Paul172281d2001-07-26 20:02:10 +00001537 if (ctx->Texture.ProxyCubeMap->Image[i]) {
1538 _mesa_free_texture_image(ctx->Texture.ProxyCubeMap->Image[i]);
1539 }
jtgafb833d1999-08-19 00:55:39 +00001540 }
Brian Paula8523782000-11-19 23:10:25 +00001541 _mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
1542 _mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
1543 _mesa_free_texture_object(NULL, ctx->Texture.Proxy3D);
Brian Paul172281d2001-07-26 20:02:10 +00001544 _mesa_free_texture_object(NULL, ctx->Texture.ProxyCubeMap);
jtgafb833d1999-08-19 00:55:39 +00001545 return GL_FALSE;
1546 }
1547 else {
1548 return GL_TRUE;
1549 }
1550}
1551
1552
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001553static void add_debug_flags( const char *debug )
1554{
1555#ifdef MESA_DEBUG
1556 if (strstr(debug, "varray"))
1557 MESA_VERBOSE |= VERBOSE_VARRAY;
1558
1559 if (strstr(debug, "tex"))
1560 MESA_VERBOSE |= VERBOSE_TEXTURE;
1561
1562 if (strstr(debug, "imm"))
1563 MESA_VERBOSE |= VERBOSE_IMMEDIATE;
1564
1565 if (strstr(debug, "pipe"))
1566 MESA_VERBOSE |= VERBOSE_PIPELINE;
1567
1568 if (strstr(debug, "driver"))
1569 MESA_VERBOSE |= VERBOSE_DRIVER;
1570
1571 if (strstr(debug, "state"))
1572 MESA_VERBOSE |= VERBOSE_STATE;
1573
1574 if (strstr(debug, "api"))
1575 MESA_VERBOSE |= VERBOSE_API;
1576
1577 if (strstr(debug, "list"))
1578 MESA_VERBOSE |= VERBOSE_DISPLAY_LIST;
1579
1580 if (strstr(debug, "lighting"))
1581 MESA_VERBOSE |= VERBOSE_LIGHTING;
1582
1583 /* Debug flag:
1584 */
1585 if (strstr(debug, "flush"))
1586 MESA_DEBUG_FLAGS |= DEBUG_ALWAYS_FLUSH;
1587#endif
1588}
1589
1590
jtgafb833d1999-08-19 00:55:39 +00001591/*
Brian Paul8aee2a32000-08-29 18:57:58 +00001592 * Initialize a GLcontext struct. This includes allocating all the
1593 * other structs and arrays which hang off of the context by pointers.
jtgafb833d1999-08-19 00:55:39 +00001594 */
Brian Paul178a1c52000-04-22 01:05:00 +00001595GLboolean
1596_mesa_initialize_context( GLcontext *ctx,
Brian Paulbe3602d2001-02-28 00:27:48 +00001597 const GLvisual *visual,
Brian Paul178a1c52000-04-22 01:05:00 +00001598 GLcontext *share_list,
Brian Paul9a33a112002-06-13 04:28:29 +00001599 const __GLimports *imports )
jtgafb833d1999-08-19 00:55:39 +00001600{
Brian Paul5fb84d22000-05-24 15:04:45 +00001601 GLuint dispatchSize;
1602
Brian Paul9a33a112002-06-13 04:28:29 +00001603 ASSERT(imports);
1604 ASSERT(imports->other); /* other points to the device driver's context */
jtgafb833d1999-08-19 00:55:39 +00001605
Brian Paul4753d602002-06-15 02:38:15 +00001606 /* assing imports */
1607 ctx->imports = *imports;
jtgafb833d1999-08-19 00:55:39 +00001608
Brian Paul9a33a112002-06-13 04:28:29 +00001609 /* initialize the exports (Mesa functions called by the window system) */
Brian Paul4753d602002-06-15 02:38:15 +00001610 _mesa_init_default_exports( &(ctx->exports) );
1611
1612 /* misc one-time initializations */
1613 one_time_init(ctx);
Brian Paul9a33a112002-06-13 04:28:29 +00001614
1615#if 0
Brian Paulb1394fa2000-09-26 20:53:53 +00001616 /**
1617 ** OpenGL SI stuff
1618 **/
1619 if (!ctx->imports.malloc) {
Brian Paul9a33a112002-06-13 04:28:29 +00001620 _mesa_init_default_imports(&ctx->imports, driver_ctx);
Brian Paulb1394fa2000-09-26 20:53:53 +00001621 }
1622 /* exports are setup by the device driver */
Brian Paul9a33a112002-06-13 04:28:29 +00001623#endif
Brian Paulb1394fa2000-09-26 20:53:53 +00001624
Brian Paul9a33a112002-06-13 04:28:29 +00001625 ctx->DriverCtx = imports->other;
Brian Paulb1394fa2000-09-26 20:53:53 +00001626 ctx->Visual = *visual;
Brian Paul3f02f901999-11-24 18:48:30 +00001627 ctx->DrawBuffer = NULL;
1628 ctx->ReadBuffer = NULL;
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00001629
jtgafb833d1999-08-19 00:55:39 +00001630 if (share_list) {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001631 /* share state with another context */
jtgafb833d1999-08-19 00:55:39 +00001632 ctx->Shared = share_list->Shared;
1633 }
1634 else {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001635 /* allocate new, unshared state */
jtgafb833d1999-08-19 00:55:39 +00001636 ctx->Shared = alloc_shared_state();
1637 if (!ctx->Shared) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001638 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001639 }
1640 }
Brian Paul9560f052000-01-31 23:11:39 +00001641 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001642 ctx->Shared->RefCount++;
Brian Paul9560f052000-01-31 23:11:39 +00001643 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001644
Brian Paul5a2f32b2001-04-25 18:21:05 +00001645 /* Effectively bind the default textures to all texture units */
1646 ctx->Shared->Default1D->RefCount += MAX_TEXTURE_UNITS;
1647 ctx->Shared->Default2D->RefCount += MAX_TEXTURE_UNITS;
1648 ctx->Shared->Default3D->RefCount += MAX_TEXTURE_UNITS;
1649 ctx->Shared->DefaultCubeMap->RefCount += MAX_TEXTURE_UNITS;
1650
Brian Paul4d053dd2000-01-14 04:45:47 +00001651 init_attrib_groups( ctx );
1652
Brian Paulb6bcae52001-01-23 23:39:36 +00001653 if (visual->doubleBufferMode) {
jtgafb833d1999-08-19 00:55:39 +00001654 ctx->Color.DrawBuffer = GL_BACK;
1655 ctx->Color.DriverDrawBuffer = GL_BACK_LEFT;
1656 ctx->Color.DrawDestMask = BACK_LEFT_BIT;
1657 ctx->Pixel.ReadBuffer = GL_BACK;
1658 ctx->Pixel.DriverReadBuffer = GL_BACK_LEFT;
1659 }
1660 else {
1661 ctx->Color.DrawBuffer = GL_FRONT;
1662 ctx->Color.DriverDrawBuffer = GL_FRONT_LEFT;
1663 ctx->Color.DrawDestMask = FRONT_LEFT_BIT;
1664 ctx->Pixel.ReadBuffer = GL_FRONT;
1665 ctx->Pixel.DriverReadBuffer = GL_FRONT_LEFT;
1666 }
1667
jtgafb833d1999-08-19 00:55:39 +00001668 if (!alloc_proxy_textures(ctx)) {
1669 free_shared_state(ctx, ctx->Shared);
Brian Paul4d053dd2000-01-14 04:45:47 +00001670 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001671 }
jtgafb833d1999-08-19 00:55:39 +00001672
Brian Paulf59afc92000-05-23 23:23:00 +00001673 /* register the most recent extension functions with libGL */
1674 _glapi_add_entrypoint("glTbufferMask3DFX", 553);
1675 _glapi_add_entrypoint("glCompressedTexImage3DARB", 554);
1676 _glapi_add_entrypoint("glCompressedTexImage2DARB", 555);
1677 _glapi_add_entrypoint("glCompressedTexImage1DARB", 556);
1678 _glapi_add_entrypoint("glCompressedTexSubImage3DARB", 557);
1679 _glapi_add_entrypoint("glCompressedTexSubImage2DARB", 558);
1680 _glapi_add_entrypoint("glCompressedTexSubImage1DARB", 559);
1681 _glapi_add_entrypoint("glGetCompressedTexImageARB", 560);
1682
Brian Paul5fb84d22000-05-24 15:04:45 +00001683 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
1684 * In practice, this'll be the same for stand-alone Mesa. But for DRI
1685 * Mesa we do this to accomodate different versions of libGL and various
1686 * DRI drivers.
1687 */
1688 dispatchSize = MAX2(_glapi_get_dispatch_table_size(),
1689 sizeof(struct _glapi_table) / sizeof(void *));
1690
Brian Paulfbd8f211999-11-11 01:22:25 +00001691 /* setup API dispatch tables */
Brian Paul5fb84d22000-05-24 15:04:45 +00001692 ctx->Exec = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
1693 ctx->Save = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001694 if (!ctx->Exec || !ctx->Save) {
1695 free_shared_state(ctx, ctx->Shared);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001696 if (ctx->Exec)
Brian Paul2d8db392000-06-27 22:10:00 +00001697 FREE( ctx->Exec );
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001698 }
Brian Paul5fb84d22000-05-24 15:04:45 +00001699 _mesa_init_exec_table(ctx->Exec, dispatchSize);
1700 _mesa_init_dlist_table(ctx->Save, dispatchSize);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001701 ctx->CurrentDispatch = ctx->Exec;
jtgafb833d1999-08-19 00:55:39 +00001702
Keith Whitwellad2ac212000-11-24 10:25:05 +00001703 ctx->ExecPrefersFloat = GL_FALSE;
1704 ctx->SavePrefersFloat = GL_FALSE;
1705
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001706 /* Neutral tnl module stuff */
Gareth Hughesde6a2e02001-03-11 23:49:20 +00001707 _mesa_init_exec_vtxfmt( ctx );
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001708 ctx->TnlModule.Current = NULL;
1709 ctx->TnlModule.SwapCount = 0;
1710
Brian Paulb6bcae52001-01-23 23:39:36 +00001711 /* Z buffer stuff */
1712 if (ctx->Visual.depthBits == 0) {
1713 /* Special case. Even if we don't have a depth buffer we need
1714 * good values for DepthMax for Z vertex transformation purposes
1715 * and for per-fragment fog computation.
1716 */
1717 ctx->DepthMax = 1 << 16;
1718 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1719 }
1720 else if (ctx->Visual.depthBits < 32) {
1721 ctx->DepthMax = (1 << ctx->Visual.depthBits) - 1;
1722 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1723 }
1724 else {
1725 /* Special case since shift values greater than or equal to the
1726 * number of bits in the left hand expression's type are undefined.
1727 */
1728 ctx->DepthMax = 0xffffffff;
1729 ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
1730 }
Brian Paulbc920f02001-05-07 16:32:51 +00001731 ctx->MRD = 1.0; /* Minimum resolvable depth value, for polygon offset */
Brian Paulb6bcae52001-01-23 23:39:36 +00001732
1733
Brian Paul3b18a362000-09-26 15:27:20 +00001734#if defined(MESA_TRACE)
Brian Paul9e351d52001-05-03 14:11:18 +00001735 ctx->TraceCtx = (trace_context_t *) CALLOC( sizeof(trace_context_t) );
Brian Paul45f36342000-09-05 20:28:06 +00001736#if 0
1737 /* Brian: do you want to have CreateContext fail here,
1738 or should we just trap in NewTrace (currently done)? */
1739 if (!(ctx->TraceCtx)) {
1740 free_shared_state(ctx, ctx->Shared);
Brian Paul45f36342000-09-05 20:28:06 +00001741 FREE( ctx->Exec );
1742 FREE( ctx->Save );
1743 return GL_FALSE;
1744 }
1745#endif
1746 trInitContext(ctx->TraceCtx);
1747
1748 ctx->TraceDispatch = (struct _glapi_table *)
1749 CALLOC(dispatchSize * sizeof(void*));
1750#if 0
1751 if (!(ctx->TraceCtx)) {
1752 free_shared_state(ctx, ctx->Shared);
Brian Paul45f36342000-09-05 20:28:06 +00001753 FREE( ctx->Exec );
1754 FREE( ctx->Save );
1755 FREE( ctx->TraceCtx );
1756 return GL_FALSE;
1757 }
1758#endif
1759 trInitDispatch(ctx->TraceDispatch);
1760#endif
1761
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001762
Brian Paul4753d602002-06-15 02:38:15 +00001763 if (ctx->imports.getenv(ctx, "MESA_DEBUG"))
1764 add_debug_flags(ctx->imports.getenv(ctx, "MESA_DEBUG"));
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001765
Brian Paul4753d602002-06-15 02:38:15 +00001766 if (ctx->imports.getenv(ctx, "MESA_VERBOSE"))
1767 add_debug_flags(ctx->imports.getenv(ctx, "MESA_VERBOSE"));
Keith Whitwell306d3fc2002-04-09 16:56:50 +00001768
Brian Paul4d053dd2000-01-14 04:45:47 +00001769 return GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001770}
1771
jtgafb833d1999-08-19 00:55:39 +00001772
1773
1774/*
Brian Paul4d053dd2000-01-14 04:45:47 +00001775 * Allocate and initialize a GLcontext structure.
Brian Paulbe3602d2001-02-28 00:27:48 +00001776 * Input: visual - a GLvisual pointer (we copy the struct contents)
Brian Paul4d053dd2000-01-14 04:45:47 +00001777 * sharelist - another context to share display lists with or NULL
Brian Paul9a33a112002-06-13 04:28:29 +00001778 * imports - points to a fully-initialized __GLimports object.
Brian Paulb1394fa2000-09-26 20:53:53 +00001779 * Return: pointer to a new __GLcontextRec or NULL if error.
Brian Paul4d053dd2000-01-14 04:45:47 +00001780 */
Brian Paul178a1c52000-04-22 01:05:00 +00001781GLcontext *
Brian Paulbe3602d2001-02-28 00:27:48 +00001782_mesa_create_context( const GLvisual *visual,
Brian Paulb1394fa2000-09-26 20:53:53 +00001783 GLcontext *share_list,
Brian Paul9a33a112002-06-13 04:28:29 +00001784 const __GLimports *imports )
Brian Paul4d053dd2000-01-14 04:45:47 +00001785{
Brian Paul4753d602002-06-15 02:38:15 +00001786 GLcontext *ctx;
1787
1788 ASSERT(visual);
1789 ASSERT(imports);
1790 ASSERT(imports->calloc);
1791
1792 ctx = (GLcontext *) imports->calloc(NULL, 1, sizeof(GLcontext));
1793 if (!ctx)
Brian Paul4d053dd2000-01-14 04:45:47 +00001794 return NULL;
Brian Paul4753d602002-06-15 02:38:15 +00001795
Brian Paul9a33a112002-06-13 04:28:29 +00001796 ctx->Driver.CurrentExecPrimitive = 0; /* XXX why is this here??? */
Brian Paul4753d602002-06-15 02:38:15 +00001797
Brian Paul9a33a112002-06-13 04:28:29 +00001798 if (_mesa_initialize_context(ctx, visual, share_list, imports)) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001799 return ctx;
1800 }
1801 else {
Brian Paul4753d602002-06-15 02:38:15 +00001802 imports->free(NULL, ctx);
Brian Paul4d053dd2000-01-14 04:45:47 +00001803 return NULL;
1804 }
1805}
1806
1807
1808
1809/*
1810 * Free the data associated with the given context.
1811 * But don't free() the GLcontext struct itself!
1812 */
Brian Paul178a1c52000-04-22 01:05:00 +00001813void
Brian Paulb1394fa2000-09-26 20:53:53 +00001814_mesa_free_context_data( GLcontext *ctx )
Brian Paul4d053dd2000-01-14 04:45:47 +00001815{
Brian Paul4d053dd2000-01-14 04:45:47 +00001816 struct gl_shine_tab *s, *tmps;
Brian Paul30f51ae2001-12-18 04:06:44 +00001817 GLuint i;
Brian Paul4d053dd2000-01-14 04:45:47 +00001818
1819 /* if we're destroying the current context, unbind it first */
Brian Paulb1394fa2000-09-26 20:53:53 +00001820 if (ctx == _mesa_get_current_context()) {
1821 _mesa_make_current(NULL, NULL);
Brian Paul4d053dd2000-01-14 04:45:47 +00001822 }
1823
Brian Paul30f51ae2001-12-18 04:06:44 +00001824 /*
1825 * Free transformation matrix stacks
1826 */
1827 free_matrix_stack(&ctx->ModelviewMatrixStack);
1828 free_matrix_stack(&ctx->ProjectionMatrixStack);
1829 free_matrix_stack(&ctx->ColorMatrixStack);
1830 for (i = 0; i < MAX_TEXTURE_UNITS; i++)
1831 free_matrix_stack(&ctx->TextureMatrixStack[i]);
1832 for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
1833 free_matrix_stack(&ctx->ProgramMatrixStack[i]);
1834 /* combined Modelview*Projection matrix */
Brian Paulfd284452001-07-19 15:54:34 +00001835 _math_matrix_dtr( &ctx->_ModelProjectMatrix );
1836
Brian Paul30f51ae2001-12-18 04:06:44 +00001837
1838 if (ctx->VertexProgram.Current) {
1839 ctx->VertexProgram.Current->RefCount--;
1840 if (ctx->VertexProgram.Current->RefCount <= 0)
1841 _mesa_delete_program(ctx, ctx->VertexProgram.CurrentID);
Brian Paulfd284452001-07-19 15:54:34 +00001842 }
1843
Brian Paul30f51ae2001-12-18 04:06:44 +00001844 /* Shared context state (display lists, textures, etc) */
Brian Paul9560f052000-01-31 23:11:39 +00001845 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
Brian Paul4d053dd2000-01-14 04:45:47 +00001846 ctx->Shared->RefCount--;
Brian Paul9560f052000-01-31 23:11:39 +00001847 assert(ctx->Shared->RefCount >= 0);
1848 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1849 if (ctx->Shared->RefCount == 0) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001850 /* free shared state */
1851 free_shared_state( ctx, ctx->Shared );
1852 }
1853
Brian Paul30f51ae2001-12-18 04:06:44 +00001854 /* Free lighting shininess exponentiation table */
Keith Whitwell14940c42000-11-05 18:40:57 +00001855 foreach_s( s, tmps, ctx->_ShineTabList ) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001856 FREE( s );
1857 }
Keith Whitwell14940c42000-11-05 18:40:57 +00001858 FREE( ctx->_ShineTabList );
Brian Paul4d053dd2000-01-14 04:45:47 +00001859
1860 /* Free proxy texture objects */
Brian Paula8523782000-11-19 23:10:25 +00001861 _mesa_free_texture_object( NULL, ctx->Texture.Proxy1D );
1862 _mesa_free_texture_object( NULL, ctx->Texture.Proxy2D );
1863 _mesa_free_texture_object( NULL, ctx->Texture.Proxy3D );
Brian Paulfd284452001-07-19 15:54:34 +00001864 _mesa_free_texture_object( NULL, ctx->Texture.ProxyCubeMap );
Brian Paul4d053dd2000-01-14 04:45:47 +00001865
1866 /* Free evaluator data */
1867 if (ctx->EvalMap.Map1Vertex3.Points)
1868 FREE( ctx->EvalMap.Map1Vertex3.Points );
1869 if (ctx->EvalMap.Map1Vertex4.Points)
1870 FREE( ctx->EvalMap.Map1Vertex4.Points );
1871 if (ctx->EvalMap.Map1Index.Points)
1872 FREE( ctx->EvalMap.Map1Index.Points );
1873 if (ctx->EvalMap.Map1Color4.Points)
1874 FREE( ctx->EvalMap.Map1Color4.Points );
1875 if (ctx->EvalMap.Map1Normal.Points)
1876 FREE( ctx->EvalMap.Map1Normal.Points );
1877 if (ctx->EvalMap.Map1Texture1.Points)
1878 FREE( ctx->EvalMap.Map1Texture1.Points );
1879 if (ctx->EvalMap.Map1Texture2.Points)
1880 FREE( ctx->EvalMap.Map1Texture2.Points );
1881 if (ctx->EvalMap.Map1Texture3.Points)
1882 FREE( ctx->EvalMap.Map1Texture3.Points );
1883 if (ctx->EvalMap.Map1Texture4.Points)
1884 FREE( ctx->EvalMap.Map1Texture4.Points );
Brian Paulc4afba32002-02-05 23:21:45 +00001885 for (i = 0; i < 16; i++)
1886 FREE((ctx->EvalMap.Map1Attrib[i].Points));
Brian Paul4d053dd2000-01-14 04:45:47 +00001887
1888 if (ctx->EvalMap.Map2Vertex3.Points)
1889 FREE( ctx->EvalMap.Map2Vertex3.Points );
1890 if (ctx->EvalMap.Map2Vertex4.Points)
1891 FREE( ctx->EvalMap.Map2Vertex4.Points );
1892 if (ctx->EvalMap.Map2Index.Points)
1893 FREE( ctx->EvalMap.Map2Index.Points );
1894 if (ctx->EvalMap.Map2Color4.Points)
1895 FREE( ctx->EvalMap.Map2Color4.Points );
1896 if (ctx->EvalMap.Map2Normal.Points)
1897 FREE( ctx->EvalMap.Map2Normal.Points );
1898 if (ctx->EvalMap.Map2Texture1.Points)
1899 FREE( ctx->EvalMap.Map2Texture1.Points );
1900 if (ctx->EvalMap.Map2Texture2.Points)
1901 FREE( ctx->EvalMap.Map2Texture2.Points );
1902 if (ctx->EvalMap.Map2Texture3.Points)
1903 FREE( ctx->EvalMap.Map2Texture3.Points );
1904 if (ctx->EvalMap.Map2Texture4.Points)
1905 FREE( ctx->EvalMap.Map2Texture4.Points );
Brian Paulc4afba32002-02-05 23:21:45 +00001906 for (i = 0; i < 16; i++)
1907 FREE((ctx->EvalMap.Map2Attrib[i].Points));
Brian Paul4d053dd2000-01-14 04:45:47 +00001908
Brian Paul4bdcfe52000-04-17 17:57:04 +00001909 _mesa_free_colortable_data( &ctx->ColorTable );
1910 _mesa_free_colortable_data( &ctx->PostConvolutionColorTable );
1911 _mesa_free_colortable_data( &ctx->PostColorMatrixColorTable );
1912 _mesa_free_colortable_data( &ctx->Texture.Palette );
1913
Brian Paulfd284452001-07-19 15:54:34 +00001914 _math_matrix_dtr(&ctx->Viewport._WindowMap);
1915
Brian Paul69755402001-02-26 23:58:12 +00001916 _mesa_extensions_dtr(ctx);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001917
1918 FREE(ctx->Exec);
1919 FREE(ctx->Save);
Brian Paul4d053dd2000-01-14 04:45:47 +00001920}
1921
1922
1923
1924/*
1925 * Destroy a GLcontext structure.
jtgafb833d1999-08-19 00:55:39 +00001926 */
Brian Paul178a1c52000-04-22 01:05:00 +00001927void
Brian Paulb1394fa2000-09-26 20:53:53 +00001928_mesa_destroy_context( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001929{
1930 if (ctx) {
Brian Paulb1394fa2000-09-26 20:53:53 +00001931 _mesa_free_context_data(ctx);
Brian Paulbd5cdaf1999-10-13 18:42:49 +00001932 FREE( (void *) ctx );
jtgafb833d1999-08-19 00:55:39 +00001933 }
1934}
1935
1936
1937
1938/*
jtgafb833d1999-08-19 00:55:39 +00001939 * Copy attribute groups from one context to another.
1940 * Input: src - source context
1941 * dst - destination context
1942 * mask - bitwise OR of GL_*_BIT flags
1943 */
Brian Paul178a1c52000-04-22 01:05:00 +00001944void
Brian Paulb1394fa2000-09-26 20:53:53 +00001945_mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
jtgafb833d1999-08-19 00:55:39 +00001946{
1947 if (mask & GL_ACCUM_BUFFER_BIT) {
1948 MEMCPY( &dst->Accum, &src->Accum, sizeof(struct gl_accum_attrib) );
1949 }
1950 if (mask & GL_COLOR_BUFFER_BIT) {
1951 MEMCPY( &dst->Color, &src->Color, sizeof(struct gl_colorbuffer_attrib) );
1952 }
1953 if (mask & GL_CURRENT_BIT) {
1954 MEMCPY( &dst->Current, &src->Current, sizeof(struct gl_current_attrib) );
1955 }
1956 if (mask & GL_DEPTH_BUFFER_BIT) {
1957 MEMCPY( &dst->Depth, &src->Depth, sizeof(struct gl_depthbuffer_attrib) );
1958 }
1959 if (mask & GL_ENABLE_BIT) {
1960 /* no op */
1961 }
1962 if (mask & GL_EVAL_BIT) {
1963 MEMCPY( &dst->Eval, &src->Eval, sizeof(struct gl_eval_attrib) );
1964 }
1965 if (mask & GL_FOG_BIT) {
1966 MEMCPY( &dst->Fog, &src->Fog, sizeof(struct gl_fog_attrib) );
1967 }
1968 if (mask & GL_HINT_BIT) {
1969 MEMCPY( &dst->Hint, &src->Hint, sizeof(struct gl_hint_attrib) );
1970 }
1971 if (mask & GL_LIGHTING_BIT) {
1972 MEMCPY( &dst->Light, &src->Light, sizeof(struct gl_light_attrib) );
Brian Paul00037781999-12-17 14:52:35 +00001973 /* gl_reinit_light_attrib( &dst->Light ); */
jtgafb833d1999-08-19 00:55:39 +00001974 }
1975 if (mask & GL_LINE_BIT) {
1976 MEMCPY( &dst->Line, &src->Line, sizeof(struct gl_line_attrib) );
1977 }
1978 if (mask & GL_LIST_BIT) {
1979 MEMCPY( &dst->List, &src->List, sizeof(struct gl_list_attrib) );
1980 }
1981 if (mask & GL_PIXEL_MODE_BIT) {
1982 MEMCPY( &dst->Pixel, &src->Pixel, sizeof(struct gl_pixel_attrib) );
1983 }
1984 if (mask & GL_POINT_BIT) {
1985 MEMCPY( &dst->Point, &src->Point, sizeof(struct gl_point_attrib) );
1986 }
1987 if (mask & GL_POLYGON_BIT) {
1988 MEMCPY( &dst->Polygon, &src->Polygon, sizeof(struct gl_polygon_attrib) );
1989 }
1990 if (mask & GL_POLYGON_STIPPLE_BIT) {
1991 /* Use loop instead of MEMCPY due to problem with Portland Group's
1992 * C compiler. Reported by John Stone.
1993 */
1994 int i;
1995 for (i=0;i<32;i++) {
1996 dst->PolygonStipple[i] = src->PolygonStipple[i];
1997 }
1998 }
1999 if (mask & GL_SCISSOR_BIT) {
2000 MEMCPY( &dst->Scissor, &src->Scissor, sizeof(struct gl_scissor_attrib) );
2001 }
2002 if (mask & GL_STENCIL_BUFFER_BIT) {
2003 MEMCPY( &dst->Stencil, &src->Stencil, sizeof(struct gl_stencil_attrib) );
2004 }
2005 if (mask & GL_TEXTURE_BIT) {
2006 MEMCPY( &dst->Texture, &src->Texture, sizeof(struct gl_texture_attrib) );
2007 }
2008 if (mask & GL_TRANSFORM_BIT) {
2009 MEMCPY( &dst->Transform, &src->Transform, sizeof(struct gl_transform_attrib) );
2010 }
2011 if (mask & GL_VIEWPORT_BIT) {
2012 MEMCPY( &dst->Viewport, &src->Viewport, sizeof(struct gl_viewport_attrib) );
2013 }
Keith Whitwella96308c2000-10-30 13:31:59 +00002014 /* XXX FIXME: Call callbacks?
2015 */
2016 dst->NewState = _NEW_ALL;
jtgafb833d1999-08-19 00:55:39 +00002017}
2018
2019
Brian Paul00037781999-12-17 14:52:35 +00002020
Keith Whitwell23caf202000-11-16 21:05:34 +00002021static void print_info( void )
2022{
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002023 fprintf(stderr, "Mesa GL_VERSION = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002024 (char *) _mesa_GetString(GL_VERSION));
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002025 fprintf(stderr, "Mesa GL_RENDERER = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002026 (char *) _mesa_GetString(GL_RENDERER));
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002027 fprintf(stderr, "Mesa GL_VENDOR = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002028 (char *) _mesa_GetString(GL_VENDOR));
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002029 fprintf(stderr, "Mesa GL_EXTENSIONS = %s\n",
Keith Whitwell23caf202000-11-16 21:05:34 +00002030 (char *) _mesa_GetString(GL_EXTENSIONS));
2031#if defined(THREADS)
2032 fprintf(stderr, "Mesa thread-safe: YES\n");
2033#else
2034 fprintf(stderr, "Mesa thread-safe: NO\n");
2035#endif
2036#if defined(USE_X86_ASM)
2037 fprintf(stderr, "Mesa x86-optimized: YES\n");
2038#else
2039 fprintf(stderr, "Mesa x86-optimized: NO\n");
2040#endif
davem69e4f84b42001-06-05 03:58:20 +00002041#if defined(USE_SPARC_ASM)
2042 fprintf(stderr, "Mesa sparc-optimized: YES\n");
2043#else
2044 fprintf(stderr, "Mesa sparc-optimized: NO\n");
2045#endif
Keith Whitwell23caf202000-11-16 21:05:34 +00002046}
2047
2048
Brian Paul00037781999-12-17 14:52:35 +00002049/*
Brian Paul9a33a112002-06-13 04:28:29 +00002050 * Set the current context, binding the given frame buffer to the context.
2051 */
2052void
2053_mesa_make_current( GLcontext *newCtx, GLframebuffer *buffer )
2054{
2055 _mesa_make_current2( newCtx, buffer, buffer );
2056}
2057
2058
2059/*
Brian Paul00037781999-12-17 14:52:35 +00002060 * Bind the given context to the given draw-buffer and read-buffer
2061 * and make it the current context for this thread.
2062 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002063void
2064_mesa_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
2065 GLframebuffer *readBuffer )
Brian Paul00037781999-12-17 14:52:35 +00002066{
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002067 if (MESA_VERBOSE)
Brian Paul4753d602002-06-15 02:38:15 +00002068 _mesa_debug(newCtx, "_mesa_make_current2()\n");
Brian Paul00037781999-12-17 14:52:35 +00002069
Brian Paulbe3602d2001-02-28 00:27:48 +00002070 /* Check that the context's and framebuffer's visuals are compatible.
2071 * We could do a lot more checking here but this'll catch obvious
2072 * problems.
2073 */
2074 if (newCtx && drawBuffer && readBuffer) {
2075 if (newCtx->Visual.rgbMode != drawBuffer->Visual.rgbMode ||
2076 newCtx->Visual.redBits != drawBuffer->Visual.redBits ||
2077 newCtx->Visual.depthBits != drawBuffer->Visual.depthBits ||
2078 newCtx->Visual.stencilBits != drawBuffer->Visual.stencilBits ||
2079 newCtx->Visual.accumRedBits != drawBuffer->Visual.accumRedBits) {
2080 return; /* incompatible */
2081 }
2082 }
2083
Brian Paul00037781999-12-17 14:52:35 +00002084 /* We call this function periodically (just here for now) in
2085 * order to detect when multithreading has begun.
2086 */
2087 _glapi_check_multithread();
2088
Brian Paulf9b97d92000-01-28 20:17:42 +00002089 _glapi_set_context((void *) newCtx);
Brian Paulb1394fa2000-09-26 20:53:53 +00002090 ASSERT(_mesa_get_current_context() == newCtx);
Keith Whitwell23caf202000-11-16 21:05:34 +00002091
2092
2093 if (!newCtx) {
Brian Paul00037781999-12-17 14:52:35 +00002094 _glapi_set_dispatch(NULL); /* none current */
2095 }
Keith Whitwell23caf202000-11-16 21:05:34 +00002096 else {
2097 _glapi_set_dispatch(newCtx->CurrentDispatch);
Brian Paul00037781999-12-17 14:52:35 +00002098
Keith Whitwell23caf202000-11-16 21:05:34 +00002099 if (drawBuffer && readBuffer) {
2100 /* TODO: check if newCtx and buffer's visual match??? */
2101 newCtx->DrawBuffer = drawBuffer;
2102 newCtx->ReadBuffer = readBuffer;
2103 newCtx->NewState |= _NEW_BUFFERS;
Brian Paul08836342001-03-03 20:33:27 +00002104 /* _mesa_update_state( newCtx ); */
Brian Paul00037781999-12-17 14:52:35 +00002105 }
Keith Whitwell23caf202000-11-16 21:05:34 +00002106
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00002107 if (newCtx->Driver.MakeCurrent)
Keith Whitwell23caf202000-11-16 21:05:34 +00002108 newCtx->Driver.MakeCurrent( newCtx, drawBuffer, readBuffer );
2109
2110 /* We can use this to help debug user's problems. Tell them to set
2111 * the MESA_INFO env variable before running their app. Then the
2112 * first time each context is made current we'll print some useful
2113 * information.
2114 */
2115 if (newCtx->FirstTimeCurrent) {
Brian Paul4753d602002-06-15 02:38:15 +00002116 if (newCtx->imports.getenv(newCtx, "MESA_INFO")) {
Keith Whitwell23caf202000-11-16 21:05:34 +00002117 print_info();
2118 }
2119 newCtx->FirstTimeCurrent = GL_FALSE;
2120 }
Brian Paul00037781999-12-17 14:52:35 +00002121 }
2122}
2123
2124
2125
2126/*
2127 * Return current context handle for the calling thread.
2128 * This isn't the fastest way to get the current context.
2129 * If you need speed, see the GET_CURRENT_CONTEXT() macro in context.h
2130 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002131GLcontext *
2132_mesa_get_current_context( void )
Brian Paul00037781999-12-17 14:52:35 +00002133{
Brian Paulf9b97d92000-01-28 20:17:42 +00002134 return (GLcontext *) _glapi_get_context();
Brian Paul00037781999-12-17 14:52:35 +00002135}
2136
2137
2138
2139/*
Brian Paulfbd8f211999-11-11 01:22:25 +00002140 * This should be called by device drivers just before they do a
2141 * swapbuffers. Any pending rendering commands will be executed.
Brian Paul9a888bd2002-03-13 04:33:32 +00002142 * XXX we should really rename this function to _mesa_flush() or something.
jtgafb833d1999-08-19 00:55:39 +00002143 */
Brian Paulfbd8f211999-11-11 01:22:25 +00002144void
2145_mesa_swapbuffers(GLcontext *ctx)
jtgafb833d1999-08-19 00:55:39 +00002146{
Keith Whitwellcab974c2000-12-26 05:09:27 +00002147 FLUSH_VERTICES( ctx, 0 );
jtgafb833d1999-08-19 00:55:39 +00002148}
2149
2150
Brian Paul00037781999-12-17 14:52:35 +00002151
Brian Paulfbd8f211999-11-11 01:22:25 +00002152/*
2153 * Return pointer to this context's current API dispatch table.
2154 * It'll either be the immediate-mode execute dispatcher or the
2155 * display list compile dispatcher.
2156 */
2157struct _glapi_table *
2158_mesa_get_dispatch(GLcontext *ctx)
2159{
2160 return ctx->CurrentDispatch;
2161}
2162
2163
2164
jtgafb833d1999-08-19 00:55:39 +00002165/**********************************************************************/
2166/***** Miscellaneous functions *****/
2167/**********************************************************************/
2168
2169
2170/*
2171 * This function is called when the Mesa user has stumbled into a code
2172 * path which may not be implemented fully or correctly.
2173 */
Brian Paul08836342001-03-03 20:33:27 +00002174void _mesa_problem( const GLcontext *ctx, const char *s )
jtgafb833d1999-08-19 00:55:39 +00002175{
Brian Paul4753d602002-06-15 02:38:15 +00002176 if (ctx) {
2177 ctx->imports.fprintf((GLcontext *) ctx, stderr, "Mesa implementation error: %s\n", s);
Brian Paulbb0830d2001-04-04 13:38:51 +00002178#ifdef XF86DRI
Brian Paul4753d602002-06-15 02:38:15 +00002179 ctx->imports.fprintf((GLcontext *) ctx, stderr, "Please report to the DRI bug database at dri.sourceforge.net\n");
Brian Paulbb0830d2001-04-04 13:38:51 +00002180#else
Brian Paul4753d602002-06-15 02:38:15 +00002181 ctx->imports.fprintf((GLcontext *) ctx, stderr, "Please report to the Mesa bug database at www.mesa3d.org\n" );
Brian Paulbb0830d2001-04-04 13:38:51 +00002182#endif
Brian Paul4753d602002-06-15 02:38:15 +00002183 }
2184 else {
2185 /* what can we do if we don't have a context???? */
2186 fprintf( stderr, "Mesa implementation error: %s\n", s );
2187#ifdef XF86DRI
2188 fprintf( stderr, "Please report to the DRI bug database at dri.sourceforge.net\n");
2189#else
2190 fprintf( stderr, "Please report to the Mesa bug database at www.mesa3d.org\n" );
2191#endif
2192 }
jtgafb833d1999-08-19 00:55:39 +00002193}
2194
2195
2196
2197/*
2198 * This is called to inform the user that he or she has tried to do
2199 * something illogical or if there's likely a bug in their program
2200 * (like enabled depth testing without a depth buffer).
2201 */
Brian Paulb1394fa2000-09-26 20:53:53 +00002202void
2203_mesa_warning( const GLcontext *ctx, const char *s )
jtgafb833d1999-08-19 00:55:39 +00002204{
Brian Paulb1394fa2000-09-26 20:53:53 +00002205 (*ctx->imports.warning)((__GLcontext *) ctx, (char *) s);
jtgafb833d1999-08-19 00:55:39 +00002206}
2207
2208
2209
Brian Paulfa9df402000-02-02 19:16:46 +00002210/*
jtgafb833d1999-08-19 00:55:39 +00002211 * This is Mesa's error handler. Normally, all that's done is the updating
2212 * of the current error value. If Mesa is compiled with -DDEBUG or if the
2213 * environment variable "MESA_DEBUG" is defined then a real error message
2214 * is printed to stderr.
Brian Paul7eb06032000-07-14 04:13:40 +00002215 * Input: ctx - the GL context
2216 * error - the error value
2217 * where - usually the name of function where error was detected
jtgafb833d1999-08-19 00:55:39 +00002218 */
Brian Paul7eb06032000-07-14 04:13:40 +00002219void
Brian Paul08836342001-03-03 20:33:27 +00002220_mesa_error( GLcontext *ctx, GLenum error, const char *where )
jtgafb833d1999-08-19 00:55:39 +00002221{
Brian Paul4753d602002-06-15 02:38:15 +00002222 const char *debugEnv;
jtgafb833d1999-08-19 00:55:39 +00002223 GLboolean debug;
2224
Brian Paul4753d602002-06-15 02:38:15 +00002225 if (ctx)
2226 debugEnv = ctx->imports.getenv(ctx, "MESA_DEBUG");
2227 else
2228 /* what can we do??? */
2229 debugEnv = "";
2230
jtgafb833d1999-08-19 00:55:39 +00002231#ifdef DEBUG
Brian Paul7eb06032000-07-14 04:13:40 +00002232 if (debugEnv && strstr(debugEnv, "silent"))
jtgafb833d1999-08-19 00:55:39 +00002233 debug = GL_FALSE;
Brian Paul7eb06032000-07-14 04:13:40 +00002234 else
2235 debug = GL_TRUE;
2236#else
2237 if (debugEnv)
2238 debug = GL_TRUE;
2239 else
2240 debug = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00002241#endif
2242
2243 if (debug) {
Brian Paul7eb06032000-07-14 04:13:40 +00002244 const char *errstr;
jtgafb833d1999-08-19 00:55:39 +00002245 switch (error) {
2246 case GL_NO_ERROR:
Brian Paul7eb06032000-07-14 04:13:40 +00002247 errstr = "GL_NO_ERROR";
jtgafb833d1999-08-19 00:55:39 +00002248 break;
2249 case GL_INVALID_VALUE:
Brian Paul7eb06032000-07-14 04:13:40 +00002250 errstr = "GL_INVALID_VALUE";
jtgafb833d1999-08-19 00:55:39 +00002251 break;
2252 case GL_INVALID_ENUM:
Brian Paul7eb06032000-07-14 04:13:40 +00002253 errstr = "GL_INVALID_ENUM";
jtgafb833d1999-08-19 00:55:39 +00002254 break;
2255 case GL_INVALID_OPERATION:
Brian Paul7eb06032000-07-14 04:13:40 +00002256 errstr = "GL_INVALID_OPERATION";
jtgafb833d1999-08-19 00:55:39 +00002257 break;
2258 case GL_STACK_OVERFLOW:
Brian Paul7eb06032000-07-14 04:13:40 +00002259 errstr = "GL_STACK_OVERFLOW";
jtgafb833d1999-08-19 00:55:39 +00002260 break;
2261 case GL_STACK_UNDERFLOW:
Brian Paul7eb06032000-07-14 04:13:40 +00002262 errstr = "GL_STACK_UNDERFLOW";
jtgafb833d1999-08-19 00:55:39 +00002263 break;
2264 case GL_OUT_OF_MEMORY:
Brian Paul7eb06032000-07-14 04:13:40 +00002265 errstr = "GL_OUT_OF_MEMORY";
jtgafb833d1999-08-19 00:55:39 +00002266 break;
Brian Paul86586aa2000-06-29 18:55:52 +00002267 case GL_TABLE_TOO_LARGE:
Brian Paul7eb06032000-07-14 04:13:40 +00002268 errstr = "GL_TABLE_TOO_LARGE";
Brian Paul86586aa2000-06-29 18:55:52 +00002269 break;
jtgafb833d1999-08-19 00:55:39 +00002270 default:
Brian Paul7eb06032000-07-14 04:13:40 +00002271 errstr = "unknown";
jtgafb833d1999-08-19 00:55:39 +00002272 break;
2273 }
Brian Paul7eb06032000-07-14 04:13:40 +00002274 fprintf(stderr, "Mesa user error: %s in %s\n", errstr, where);
jtgafb833d1999-08-19 00:55:39 +00002275 }
2276
Brian Paul18a285a2002-03-16 00:53:15 +00002277 if (!ctx)
2278 return;
2279
Brian Paul7eb06032000-07-14 04:13:40 +00002280 if (ctx->ErrorValue == GL_NO_ERROR) {
jtgafb833d1999-08-19 00:55:39 +00002281 ctx->ErrorValue = error;
2282 }
2283
2284 /* Call device driver's error handler, if any. This is used on the Mac. */
2285 if (ctx->Driver.Error) {
2286 (*ctx->Driver.Error)( ctx );
2287 }
2288}
2289
2290
Brian Paul9a33a112002-06-13 04:28:29 +00002291/*
Brian Paul4753d602002-06-15 02:38:15 +00002292 * Call this to report debug information. Uses stderr.
Brian Paul9a33a112002-06-13 04:28:29 +00002293 */
Brian Paul9a33a112002-06-13 04:28:29 +00002294void
Brian Paul4753d602002-06-15 02:38:15 +00002295_mesa_debug( const GLcontext *ctx, const char *fmtString, ... )
Brian Paul9a33a112002-06-13 04:28:29 +00002296{
2297 va_list args;
2298 va_start( args, fmtString );
Brian Paul4753d602002-06-15 02:38:15 +00002299 (void) ctx->imports.fprintf( (__GLcontext *) ctx, stderr, fmtString, args );
Brian Paul9a33a112002-06-13 04:28:29 +00002300 va_end( args );
Brian Pauld09a1d82002-06-13 04:49:17 +00002301}
Brian Paul9a33a112002-06-13 04:28:29 +00002302
jtgafb833d1999-08-19 00:55:39 +00002303
Brian Paul4753d602002-06-15 02:38:15 +00002304/*
2305 * A wrapper for printf. Uses stdout.
2306 */
2307void
2308_mesa_printf( const GLcontext *ctx, const char *fmtString, ... )
2309{
2310 va_list args;
2311 va_start( args, fmtString );
2312 (void) ctx->imports.fprintf( (__GLcontext *) ctx, stdout, fmtString, args );
2313 va_end( args );
2314}
2315
2316
2317
Brian Paulfa9df402000-02-02 19:16:46 +00002318void
2319_mesa_Finish( void )
jtgafb833d1999-08-19 00:55:39 +00002320{
Brian Paulfa9df402000-02-02 19:16:46 +00002321 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00002322 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00002323 if (ctx->Driver.Finish) {
2324 (*ctx->Driver.Finish)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002325 }
2326}
2327
2328
2329
Brian Paulfa9df402000-02-02 19:16:46 +00002330void
2331_mesa_Flush( void )
jtgafb833d1999-08-19 00:55:39 +00002332{
Brian Paulfa9df402000-02-02 19:16:46 +00002333 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00002334 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00002335 if (ctx->Driver.Flush) {
2336 (*ctx->Driver.Flush)( ctx );
jtgafb833d1999-08-19 00:55:39 +00002337 }
jtgafb833d1999-08-19 00:55:39 +00002338}
Brian Paul48c6a6e2000-09-08 21:28:04 +00002339
2340
2341
Keith Whitwellcab974c2000-12-26 05:09:27 +00002342const char *_mesa_prim_name[GL_POLYGON+4] = {
Brian Paul48c6a6e2000-09-08 21:28:04 +00002343 "GL_POINTS",
2344 "GL_LINES",
2345 "GL_LINE_LOOP",
2346 "GL_LINE_STRIP",
2347 "GL_TRIANGLES",
2348 "GL_TRIANGLE_STRIP",
2349 "GL_TRIANGLE_FAN",
2350 "GL_QUADS",
2351 "GL_QUAD_STRIP",
2352 "GL_POLYGON",
Keith Whitwellcab974c2000-12-26 05:09:27 +00002353 "outside begin/end",
2354 "inside unkown primitive",
2355 "unknown state"
Brian Paul48c6a6e2000-09-08 21:28:04 +00002356};