~ubuntu-branches/ubuntu/quantal/mesa-glw/quantal

« back to all changes in this revision

Viewing changes to src/mesa/main/context.c

  • Committer: Bazaar Package Importer
  • Author(s): Morten Kjeldgaard
  • Date: 2008-05-06 16:19:15 UTC
  • Revision ID: james.westby@ubuntu.com-20080506161915-uynz7nftmfixu6bq
Tags: upstream-7.0.3
ImportĀ upstreamĀ versionĀ 7.0.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/**
 
2
 * \file context.c
 
3
 * Mesa context/visual/framebuffer management functions.
 
4
 * \author Brian Paul
 
5
 */
 
6
 
 
7
/*
 
8
 * Mesa 3-D graphics library
 
9
 * Version:  7.0.2
 
10
 *
 
11
 * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
 
12
 *
 
13
 * Permission is hereby granted, free of charge, to any person obtaining a
 
14
 * copy of this software and associated documentation files (the "Software"),
 
15
 * to deal in the Software without restriction, including without limitation
 
16
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 
17
 * and/or sell copies of the Software, and to permit persons to whom the
 
18
 * Software is furnished to do so, subject to the following conditions:
 
19
 *
 
20
 * The above copyright notice and this permission notice shall be included
 
21
 * in all copies or substantial portions of the Software.
 
22
 *
 
23
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 
24
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 
25
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 
26
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 
27
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 
28
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
29
 */
 
30
 
 
31
 
 
32
/**
 
33
 * \mainpage Mesa Main Module
 
34
 *
 
35
 * \section MainIntroduction Introduction
 
36
 *
 
37
 * The Mesa Main module consists of all the files in the main/ directory.
 
38
 * Among the features of this module are:
 
39
 * <UL>
 
40
 * <LI> Structures to represent most GL state </LI>
 
41
 * <LI> State set/get functions </LI>
 
42
 * <LI> Display lists </LI>
 
43
 * <LI> Texture unit, object and image handling </LI>
 
44
 * <LI> Matrix and attribute stacks </LI>
 
45
 * </UL>
 
46
 *
 
47
 * Other modules are responsible for API dispatch, vertex transformation,
 
48
 * point/line/triangle setup, rasterization, vertex array caching,
 
49
 * vertex/fragment programs/shaders, etc.
 
50
 *
 
51
 *
 
52
 * \section AboutDoxygen About Doxygen
 
53
 *
 
54
 * If you're viewing this information as Doxygen-generated HTML you'll
 
55
 * see the documentation index at the top of this page.
 
56
 *
 
57
 * The first line lists the Mesa source code modules.
 
58
 * The second line lists the indexes available for viewing the documentation
 
59
 * for each module.
 
60
 *
 
61
 * Selecting the <b>Main page</b> link will display a summary of the module
 
62
 * (this page).
 
63
 *
 
64
 * Selecting <b>Data Structures</b> will list all C structures.
 
65
 *
 
66
 * Selecting the <b>File List</b> link will list all the source files in
 
67
 * the module.
 
68
 * Selecting a filename will show a list of all functions defined in that file.
 
69
 *
 
70
 * Selecting the <b>Data Fields</b> link will display a list of all
 
71
 * documented structure members.
 
72
 *
 
73
 * Selecting the <b>Globals</b> link will display a list
 
74
 * of all functions, structures, global variables and macros in the module.
 
75
 *
 
76
 */
 
77
 
 
78
 
 
79
#include "glheader.h"
 
80
#include "imports.h"
 
81
#include "accum.h"
 
82
#include "arrayobj.h"
 
83
#include "attrib.h"
 
84
#include "blend.h"
 
85
#include "buffers.h"
 
86
#include "bufferobj.h"
 
87
#include "colortab.h"
 
88
#include "context.h"
 
89
#include "debug.h"
 
90
#include "depth.h"
 
91
#include "dlist.h"
 
92
#include "eval.h"
 
93
#include "enums.h"
 
94
#include "extensions.h"
 
95
#include "fbobject.h"
 
96
#include "feedback.h"
 
97
#include "fog.h"
 
98
#include "framebuffer.h"
 
99
#include "get.h"
 
100
#include "glthread.h"
 
101
#include "glapioffsets.h"
 
102
#include "histogram.h"
 
103
#include "hint.h"
 
104
#include "hash.h"
 
105
#include "atifragshader.h"
 
106
#include "light.h"
 
107
#include "lines.h"
 
108
#include "macros.h"
 
109
#include "matrix.h"
 
110
#include "pixel.h"
 
111
#include "points.h"
 
112
#include "polygon.h"
 
113
#if FEATURE_NV_vertex_program || FEATURE_NV_fragment_program
 
114
#include "program.h"
 
115
#endif
 
116
#include "queryobj.h"
 
117
#include "rastpos.h"
 
118
#include "simple_list.h"
 
119
#include "state.h"
 
120
#include "stencil.h"
 
121
#include "texcompress.h"
 
122
#include "teximage.h"
 
123
#include "texobj.h"
 
124
#include "texstate.h"
 
125
#include "mtypes.h"
 
126
#include "varray.h"
 
127
#include "version.h"
 
128
#include "vtxfmt.h"
 
129
#if _HAVE_FULL_GL
 
130
#include "math/m_translate.h"
 
131
#include "math/m_matrix.h"
 
132
#include "math/m_xform.h"
 
133
#include "math/mathmod.h"
 
134
#endif
 
135
#include "shader_api.h"
 
136
 
 
137
#ifdef USE_SPARC_ASM
 
138
#include "sparc/sparc.h"
 
139
#endif
 
140
 
 
141
#ifndef MESA_VERBOSE
 
142
int MESA_VERBOSE = 0;
 
143
#endif
 
144
 
 
145
#ifndef MESA_DEBUG_FLAGS
 
146
int MESA_DEBUG_FLAGS = 0;
 
147
#endif
 
148
 
 
149
 
 
150
/* ubyte -> float conversion */
 
151
GLfloat _mesa_ubyte_to_float_color_tab[256];
 
152
 
 
153
static void
 
154
free_shared_state( GLcontext *ctx, struct gl_shared_state *ss );
 
155
 
 
156
 
 
157
/**
 
158
 * Swap buffers notification callback.
 
159
 * 
 
160
 * \param gc GL context.
 
161
 *
 
162
 * Called by window system just before swapping buffers.
 
163
 * We have to finish any pending rendering.
 
164
 */
 
165
void
 
166
_mesa_notifySwapBuffers(__GLcontext *gc)
 
167
{
 
168
   FLUSH_VERTICES( gc, 0 );
 
169
}
 
170
 
 
171
 
 
172
/**********************************************************************/
 
173
/** \name GL Visual allocation/destruction                            */
 
174
/**********************************************************************/
 
175
/*@{*/
 
176
 
 
177
/**
 
178
 * Allocates a GLvisual structure and initializes it via
 
179
 * _mesa_initialize_visual().
 
180
 * 
 
181
 * \param rgbFlag GL_TRUE for RGB(A) mode, GL_FALSE for Color Index mode.
 
182
 * \param dbFlag double buffering
 
183
 * \param stereoFlag stereo buffer
 
184
 * \param depthBits requested bits per depth buffer value. Any value in [0, 32]
 
185
 * is acceptable but the actual depth type will be GLushort or GLuint as
 
186
 * needed.
 
187
 * \param stencilBits requested minimum bits per stencil buffer value
 
188
 * \param accumRedBits, accumGreenBits, accumBlueBits, accumAlphaBits number of bits per color component in accum buffer.
 
189
 * \param indexBits number of bits per pixel if \p rgbFlag is GL_FALSE
 
190
 * \param redBits number of bits per color component in frame buffer for RGB(A)
 
191
 * mode.  We always use 8 in core Mesa though.
 
192
 * \param greenBits same as above.
 
193
 * \param blueBits same as above.
 
194
 * \param alphaBits same as above.
 
195
 * \param numSamples not really used.
 
196
 * 
 
197
 * \return pointer to new GLvisual or NULL if requested parameters can't be
 
198
 * met.
 
199
 *
 
200
 * \note Need to add params for level and numAuxBuffers (at least)
 
201
 */
 
202
GLvisual *
 
203
_mesa_create_visual( GLboolean rgbFlag,
 
204
                     GLboolean dbFlag,
 
205
                     GLboolean stereoFlag,
 
206
                     GLint redBits,
 
207
                     GLint greenBits,
 
208
                     GLint blueBits,
 
209
                     GLint alphaBits,
 
210
                     GLint indexBits,
 
211
                     GLint depthBits,
 
212
                     GLint stencilBits,
 
213
                     GLint accumRedBits,
 
214
                     GLint accumGreenBits,
 
215
                     GLint accumBlueBits,
 
216
                     GLint accumAlphaBits,
 
217
                     GLint numSamples )
 
218
{
 
219
   GLvisual *vis = (GLvisual *) _mesa_calloc(sizeof(GLvisual));
 
220
   if (vis) {
 
221
      if (!_mesa_initialize_visual(vis, rgbFlag, dbFlag, stereoFlag,
 
222
                                   redBits, greenBits, blueBits, alphaBits,
 
223
                                   indexBits, depthBits, stencilBits,
 
224
                                   accumRedBits, accumGreenBits,
 
225
                                   accumBlueBits, accumAlphaBits,
 
226
                                   numSamples)) {
 
227
         _mesa_free(vis);
 
228
         return NULL;
 
229
      }
 
230
   }
 
231
   return vis;
 
232
}
 
233
 
 
234
/**
 
235
 * Makes some sanity checks and fills in the fields of the
 
236
 * GLvisual object with the given parameters.  If the caller needs
 
237
 * to set additional fields, he should just probably init the whole GLvisual
 
238
 * object himself.
 
239
 * \return GL_TRUE on success, or GL_FALSE on failure.
 
240
 *
 
241
 * \sa _mesa_create_visual() above for the parameter description.
 
242
 */
 
243
GLboolean
 
244
_mesa_initialize_visual( GLvisual *vis,
 
245
                         GLboolean rgbFlag,
 
246
                         GLboolean dbFlag,
 
247
                         GLboolean stereoFlag,
 
248
                         GLint redBits,
 
249
                         GLint greenBits,
 
250
                         GLint blueBits,
 
251
                         GLint alphaBits,
 
252
                         GLint indexBits,
 
253
                         GLint depthBits,
 
254
                         GLint stencilBits,
 
255
                         GLint accumRedBits,
 
256
                         GLint accumGreenBits,
 
257
                         GLint accumBlueBits,
 
258
                         GLint accumAlphaBits,
 
259
                         GLint numSamples )
 
260
{
 
261
   assert(vis);
 
262
 
 
263
   if (depthBits < 0 || depthBits > 32) {
 
264
      return GL_FALSE;
 
265
   }
 
266
   if (stencilBits < 0 || stencilBits > STENCIL_BITS) {
 
267
      return GL_FALSE;
 
268
   }
 
269
   assert(accumRedBits >= 0);
 
270
   assert(accumGreenBits >= 0);
 
271
   assert(accumBlueBits >= 0);
 
272
   assert(accumAlphaBits >= 0);
 
273
 
 
274
   vis->rgbMode          = rgbFlag;
 
275
   vis->doubleBufferMode = dbFlag;
 
276
   vis->stereoMode       = stereoFlag;
 
277
 
 
278
   vis->redBits          = redBits;
 
279
   vis->greenBits        = greenBits;
 
280
   vis->blueBits         = blueBits;
 
281
   vis->alphaBits        = alphaBits;
 
282
   vis->rgbBits          = redBits + greenBits + blueBits;
 
283
 
 
284
   vis->indexBits      = indexBits;
 
285
   vis->depthBits      = depthBits;
 
286
   vis->stencilBits    = stencilBits;
 
287
 
 
288
   vis->accumRedBits   = accumRedBits;
 
289
   vis->accumGreenBits = accumGreenBits;
 
290
   vis->accumBlueBits  = accumBlueBits;
 
291
   vis->accumAlphaBits = accumAlphaBits;
 
292
 
 
293
   vis->haveAccumBuffer   = accumRedBits > 0;
 
294
   vis->haveDepthBuffer   = depthBits > 0;
 
295
   vis->haveStencilBuffer = stencilBits > 0;
 
296
 
 
297
   vis->numAuxBuffers = 0;
 
298
   vis->level = 0;
 
299
   vis->pixmapMode = 0;
 
300
   vis->sampleBuffers = numSamples > 0 ? 1 : 0;
 
301
   vis->samples = numSamples;
 
302
 
 
303
   return GL_TRUE;
 
304
}
 
305
 
 
306
 
 
307
/**
 
308
 * Destroy a visual and free its memory.
 
309
 *
 
310
 * \param vis visual.
 
311
 * 
 
312
 * Frees the visual structure.
 
313
 */
 
314
void
 
315
_mesa_destroy_visual( GLvisual *vis )
 
316
{
 
317
   _mesa_free(vis);
 
318
}
 
319
 
 
320
/*@}*/
 
321
 
 
322
 
 
323
/**********************************************************************/
 
324
/** \name Context allocation, initialization, destroying
 
325
 *
 
326
 * The purpose of the most initialization functions here is to provide the
 
327
 * default state values according to the OpenGL specification.
 
328
 */
 
329
/**********************************************************************/
 
330
/*@{*/
 
331
 
 
332
/**
 
333
 * One-time initialization mutex lock.
 
334
 *
 
335
 * \sa Used by one_time_init().
 
336
 */
 
337
_glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
 
338
 
 
339
/**
 
340
 * Calls all the various one-time-init functions in Mesa.
 
341
 *
 
342
 * While holding a global mutex lock, calls several initialization functions,
 
343
 * and sets the glapi callbacks if the \c MESA_DEBUG environment variable is
 
344
 * defined.
 
345
 *
 
346
 * \sa _math_init().
 
347
 */
 
348
static void
 
349
one_time_init( GLcontext *ctx )
 
350
{
 
351
   static GLboolean alreadyCalled = GL_FALSE;
 
352
   (void) ctx;
 
353
   _glthread_LOCK_MUTEX(OneTimeLock);
 
354
   if (!alreadyCalled) {
 
355
      GLuint i;
 
356
 
 
357
      /* do some implementation tests */
 
358
      assert( sizeof(GLbyte) == 1 );
 
359
      assert( sizeof(GLubyte) == 1 );
 
360
      assert( sizeof(GLshort) == 2 );
 
361
      assert( sizeof(GLushort) == 2 );
 
362
      assert( sizeof(GLint) == 4 );
 
363
      assert( sizeof(GLuint) == 4 );
 
364
 
 
365
      _mesa_init_sqrt_table();
 
366
 
 
367
#if _HAVE_FULL_GL
 
368
      _math_init();
 
369
 
 
370
      for (i = 0; i < 256; i++) {
 
371
         _mesa_ubyte_to_float_color_tab[i] = (float) i / 255.0F;
 
372
      }
 
373
#endif
 
374
 
 
375
#ifdef USE_SPARC_ASM
 
376
      _mesa_init_sparc_glapi_relocs();
 
377
#endif
 
378
      if (_mesa_getenv("MESA_DEBUG")) {
 
379
         _glapi_noop_enable_warnings(GL_TRUE);
 
380
         _glapi_set_warning_func( (_glapi_warning_func) _mesa_warning );
 
381
      }
 
382
      else {
 
383
         _glapi_noop_enable_warnings(GL_FALSE);
 
384
      }
 
385
 
 
386
#if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
 
387
      _mesa_debug(ctx, "Mesa %s DEBUG build %s %s\n",
 
388
                  MESA_VERSION_STRING, __DATE__, __TIME__);
 
389
#endif
 
390
 
 
391
      alreadyCalled = GL_TRUE;
 
392
   }
 
393
   _glthread_UNLOCK_MUTEX(OneTimeLock);
 
394
}
 
395
 
 
396
 
 
397
/**
 
398
 * Allocate and initialize a shared context state structure.
 
399
 * Initializes the display list, texture objects and vertex programs hash
 
400
 * tables, allocates the texture objects. If it runs out of memory, frees
 
401
 * everything already allocated before returning NULL.
 
402
 *
 
403
 * \return pointer to a gl_shared_state structure on success, or NULL on
 
404
 * failure.
 
405
 */
 
406
static GLboolean
 
407
alloc_shared_state( GLcontext *ctx )
 
408
{
 
409
   struct gl_shared_state *ss = CALLOC_STRUCT(gl_shared_state);
 
410
   if (!ss)
 
411
      return GL_FALSE;
 
412
 
 
413
   ctx->Shared = ss;
 
414
 
 
415
   _glthread_INIT_MUTEX(ss->Mutex);
 
416
 
 
417
   ss->DisplayList = _mesa_NewHashTable();
 
418
   ss->TexObjects = _mesa_NewHashTable();
 
419
#if FEATURE_NV_vertex_program || FEATURE_NV_fragment_program
 
420
   ss->Programs = _mesa_NewHashTable();
 
421
#endif
 
422
 
 
423
#if FEATURE_ARB_vertex_program
 
424
   ss->DefaultVertexProgram = ctx->Driver.NewProgram(ctx, GL_VERTEX_PROGRAM_ARB, 0);
 
425
   if (!ss->DefaultVertexProgram)
 
426
      goto cleanup;
 
427
#endif
 
428
#if FEATURE_ARB_fragment_program
 
429
   ss->DefaultFragmentProgram = ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, 0);
 
430
   if (!ss->DefaultFragmentProgram)
 
431
      goto cleanup;
 
432
#endif
 
433
#if FEATURE_ATI_fragment_shader
 
434
   ss->ATIShaders = _mesa_NewHashTable();
 
435
   ss->DefaultFragmentShader = _mesa_new_ati_fragment_shader(ctx, 0);
 
436
   if (!ss->DefaultFragmentShader)
 
437
      goto cleanup;
 
438
#endif
 
439
 
 
440
#if FEATURE_ARB_vertex_buffer_object || FEATURE_ARB_pixel_buffer_object
 
441
   ss->BufferObjects = _mesa_NewHashTable();
 
442
#endif
 
443
 
 
444
   ss->ArrayObjects = _mesa_NewHashTable();
 
445
 
 
446
#if FEATURE_ARB_shader_objects
 
447
   ss->ShaderObjects = _mesa_NewHashTable();
 
448
#endif
 
449
 
 
450
   ss->Default1D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_1D);
 
451
   if (!ss->Default1D)
 
452
      goto cleanup;
 
453
 
 
454
   ss->Default2D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_2D);
 
455
   if (!ss->Default2D)
 
456
      goto cleanup;
 
457
 
 
458
   ss->Default3D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_3D);
 
459
   if (!ss->Default3D)
 
460
      goto cleanup;
 
461
 
 
462
   ss->DefaultCubeMap = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_CUBE_MAP_ARB);
 
463
   if (!ss->DefaultCubeMap)
 
464
      goto cleanup;
 
465
 
 
466
   ss->DefaultRect = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_RECTANGLE_NV);
 
467
   if (!ss->DefaultRect)
 
468
      goto cleanup;
 
469
 
 
470
   /* sanity check */
 
471
   assert(ss->Default1D->RefCount == 1);
 
472
 
 
473
   _glthread_INIT_MUTEX(ss->TexMutex);
 
474
   ss->TextureStateStamp = 0;
 
475
 
 
476
#if FEATURE_EXT_framebuffer_object
 
477
   ss->FrameBuffers = _mesa_NewHashTable();
 
478
   if (!ss->FrameBuffers)
 
479
      goto cleanup;
 
480
   ss->RenderBuffers = _mesa_NewHashTable();
 
481
   if (!ss->RenderBuffers)
 
482
      goto cleanup;
 
483
#endif
 
484
 
 
485
   return GL_TRUE;
 
486
 
 
487
cleanup:
 
488
   /* Ran out of memory at some point.  Free everything and return NULL */
 
489
   if (ss->DisplayList)
 
490
      _mesa_DeleteHashTable(ss->DisplayList);
 
491
   if (ss->TexObjects)
 
492
      _mesa_DeleteHashTable(ss->TexObjects);
 
493
#if FEATURE_NV_vertex_program
 
494
   if (ss->Programs)
 
495
      _mesa_DeleteHashTable(ss->Programs);
 
496
#endif
 
497
#if FEATURE_ARB_vertex_program
 
498
   if (ss->DefaultVertexProgram)
 
499
      ctx->Driver.DeleteProgram(ctx, ss->DefaultVertexProgram);
 
500
#endif
 
501
#if FEATURE_ARB_fragment_program
 
502
   if (ss->DefaultFragmentProgram)
 
503
      ctx->Driver.DeleteProgram(ctx, ss->DefaultFragmentProgram);
 
504
#endif
 
505
#if FEATURE_ATI_fragment_shader
 
506
   if (ss->DefaultFragmentShader)
 
507
      _mesa_delete_ati_fragment_shader(ctx, ss->DefaultFragmentShader);
 
508
#endif
 
509
#if FEATURE_ARB_vertex_buffer_object || FEATURE_ARB_pixel_buffer_object
 
510
   if (ss->BufferObjects)
 
511
      _mesa_DeleteHashTable(ss->BufferObjects);
 
512
#endif
 
513
 
 
514
   if (ss->ArrayObjects)
 
515
      _mesa_DeleteHashTable (ss->ArrayObjects);
 
516
 
 
517
#if FEATURE_ARB_shader_objects
 
518
   if (ss->ShaderObjects)
 
519
      _mesa_DeleteHashTable (ss->ShaderObjects);
 
520
#endif
 
521
 
 
522
#if FEATURE_EXT_framebuffer_object
 
523
   if (ss->FrameBuffers)
 
524
      _mesa_DeleteHashTable(ss->FrameBuffers);
 
525
   if (ss->RenderBuffers)
 
526
      _mesa_DeleteHashTable(ss->RenderBuffers);
 
527
#endif
 
528
 
 
529
   if (ss->Default1D)
 
530
      (*ctx->Driver.DeleteTexture)(ctx, ss->Default1D);
 
531
   if (ss->Default2D)
 
532
      (*ctx->Driver.DeleteTexture)(ctx, ss->Default2D);
 
533
   if (ss->Default3D)
 
534
      (*ctx->Driver.DeleteTexture)(ctx, ss->Default3D);
 
535
   if (ss->DefaultCubeMap)
 
536
      (*ctx->Driver.DeleteTexture)(ctx, ss->DefaultCubeMap);
 
537
   if (ss->DefaultRect)
 
538
      (*ctx->Driver.DeleteTexture)(ctx, ss->DefaultRect);
 
539
   if (ss)
 
540
      _mesa_free(ss);
 
541
   return GL_FALSE;
 
542
}
 
543
 
 
544
 
 
545
/**
 
546
 * Callback for deleting a display list.  Called by _mesa_HashDeleteAll().
 
547
 */
 
548
static void
 
549
delete_displaylist_cb(GLuint id, void *data, void *userData)
 
550
{
 
551
   struct mesa_display_list *list = (struct mesa_display_list *) data;
 
552
   GLcontext *ctx = (GLcontext *) userData;
 
553
   _mesa_delete_list(ctx, list);
 
554
}
 
555
 
 
556
/**
 
557
 * Callback for deleting a texture object.  Called by _mesa_HashDeleteAll().
 
558
 */
 
559
static void
 
560
delete_texture_cb(GLuint id, void *data, void *userData)
 
561
{
 
562
   struct gl_texture_object *texObj = (struct gl_texture_object *) data;
 
563
   GLcontext *ctx = (GLcontext *) userData;
 
564
   ctx->Driver.DeleteTexture(ctx, texObj);
 
565
}
 
566
 
 
567
/**
 
568
 * Callback for deleting a program object.  Called by _mesa_HashDeleteAll().
 
569
 */
 
570
static void
 
571
delete_program_cb(GLuint id, void *data, void *userData)
 
572
{
 
573
   struct gl_program *prog = (struct gl_program *) data;
 
574
   GLcontext *ctx = (GLcontext *) userData;
 
575
   ctx->Driver.DeleteProgram(ctx, prog);
 
576
}
 
577
 
 
578
/**
 
579
 * Callback for deleting an ATI fragment shader object.
 
580
 * Called by _mesa_HashDeleteAll().
 
581
 */
 
582
static void
 
583
delete_fragshader_cb(GLuint id, void *data, void *userData)
 
584
{
 
585
   struct ati_fragment_shader *shader = (struct ati_fragment_shader *) data;
 
586
   GLcontext *ctx = (GLcontext *) userData;
 
587
   _mesa_delete_ati_fragment_shader(ctx, shader);
 
588
}
 
589
 
 
590
/**
 
591
 * Callback for deleting a buffer object.  Called by _mesa_HashDeleteAll().
 
592
 */
 
593
static void
 
594
delete_bufferobj_cb(GLuint id, void *data, void *userData)
 
595
{
 
596
   struct gl_buffer_object *bufObj = (struct gl_buffer_object *) data;
 
597
   GLcontext *ctx = (GLcontext *) userData;
 
598
   ctx->Driver.DeleteBuffer(ctx, bufObj);
 
599
}
 
600
 
 
601
/**
 
602
 * Callback for deleting an array object.  Called by _mesa_HashDeleteAll().
 
603
 */
 
604
static void
 
605
delete_arrayobj_cb(GLuint id, void *data, void *userData)
 
606
{
 
607
   struct gl_array_object *arrayObj = (struct gl_array_object *) data;
 
608
   GLcontext *ctx = (GLcontext *) userData;
 
609
   _mesa_delete_array_object(ctx, arrayObj);
 
610
}
 
611
 
 
612
/**
 
613
 * Callback for deleting shader and shader programs objects.
 
614
 * Called by _mesa_HashDeleteAll().
 
615
 */
 
616
static void
 
617
delete_shader_cb(GLuint id, void *data, void *userData)
 
618
{
 
619
   GLcontext *ctx = (GLcontext *) userData;
 
620
   struct gl_shader *sh = (struct gl_shader *) data;
 
621
   if (sh->Type == GL_FRAGMENT_SHADER || sh->Type == GL_VERTEX_SHADER) {
 
622
      _mesa_free_shader(ctx, sh);
 
623
   }
 
624
   else {
 
625
      struct gl_shader_program *shProg = (struct gl_shader_program *) data;
 
626
      ASSERT(shProg->Type == GL_SHADER_PROGRAM_MESA);
 
627
      _mesa_free_shader_program(ctx, shProg);
 
628
   }
 
629
}
 
630
 
 
631
/**
 
632
 * Callback for deleting a framebuffer object.  Called by _mesa_HashDeleteAll()
 
633
 */
 
634
static void
 
635
delete_framebuffer_cb(GLuint id, void *data, void *userData)
 
636
{
 
637
   struct gl_framebuffer *fb = (struct gl_framebuffer *) data;
 
638
   /* The fact that the framebuffer is in the hashtable means its refcount
 
639
    * is one, but we're removing from the hashtable now.  So clear refcount.
 
640
    */
 
641
   /*assert(fb->RefCount == 1);*/
 
642
   fb->RefCount = 0;
 
643
 
 
644
   /* NOTE: Delete should always be defined but there are two reports
 
645
    * of it being NULL (bugs 13507, 14293).  Work-around for now.
 
646
    */
 
647
   if (fb->Delete)
 
648
      fb->Delete(fb);
 
649
}
 
650
 
 
651
/**
 
652
 * Callback for deleting a renderbuffer object. Called by _mesa_HashDeleteAll()
 
653
 */
 
654
static void
 
655
delete_renderbuffer_cb(GLuint id, void *data, void *userData)
 
656
{
 
657
   struct gl_renderbuffer *rb = (struct gl_renderbuffer *) data;
 
658
   rb->RefCount = 0;  /* see comment for FBOs above */
 
659
   rb->Delete(rb);
 
660
}
 
661
 
 
662
 
 
663
 
 
664
/**
 
665
 * Deallocate a shared state object and all children structures.
 
666
 *
 
667
 * \param ctx GL context.
 
668
 * \param ss shared state pointer.
 
669
 * 
 
670
 * Frees the display lists, the texture objects (calling the driver texture
 
671
 * deletion callback to free its private data) and the vertex programs, as well
 
672
 * as their hash tables.
 
673
 *
 
674
 * \sa alloc_shared_state().
 
675
 */
 
676
static void
 
677
free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
 
678
{
 
679
   /*
 
680
    * Free display lists
 
681
    */
 
682
   _mesa_HashDeleteAll(ss->DisplayList, delete_displaylist_cb, ctx);
 
683
   _mesa_DeleteHashTable(ss->DisplayList);
 
684
 
 
685
#if defined(FEATURE_NV_vertex_program) || defined(FEATURE_NV_fragment_program)
 
686
   _mesa_HashDeleteAll(ss->Programs, delete_program_cb, ctx);
 
687
   _mesa_DeleteHashTable(ss->Programs);
 
688
#endif
 
689
#if FEATURE_ARB_vertex_program
 
690
   ctx->Driver.DeleteProgram(ctx, ss->DefaultVertexProgram);
 
691
#endif
 
692
#if FEATURE_ARB_fragment_program
 
693
   ctx->Driver.DeleteProgram(ctx, ss->DefaultFragmentProgram);
 
694
#endif
 
695
 
 
696
#if FEATURE_ATI_fragment_shader
 
697
   _mesa_HashDeleteAll(ss->ATIShaders, delete_fragshader_cb, ctx);
 
698
   _mesa_DeleteHashTable(ss->ATIShaders);
 
699
   _mesa_delete_ati_fragment_shader(ctx, ss->DefaultFragmentShader);
 
700
#endif
 
701
 
 
702
#if FEATURE_ARB_vertex_buffer_object || FEATURE_ARB_pixel_buffer_object
 
703
   _mesa_HashDeleteAll(ss->BufferObjects, delete_bufferobj_cb, ctx);
 
704
   _mesa_DeleteHashTable(ss->BufferObjects);
 
705
#endif
 
706
 
 
707
   _mesa_HashDeleteAll(ss->ArrayObjects, delete_arrayobj_cb, ctx);
 
708
   _mesa_DeleteHashTable(ss->ArrayObjects);
 
709
 
 
710
#if FEATURE_ARB_shader_objects
 
711
   _mesa_HashDeleteAll(ss->ShaderObjects, delete_shader_cb, ctx);
 
712
   _mesa_DeleteHashTable(ss->ShaderObjects);
 
713
#endif
 
714
 
 
715
#if FEATURE_EXT_framebuffer_object
 
716
   _mesa_HashDeleteAll(ss->FrameBuffers, delete_framebuffer_cb, ctx);
 
717
   _mesa_DeleteHashTable(ss->FrameBuffers);
 
718
   _mesa_HashDeleteAll(ss->RenderBuffers, delete_renderbuffer_cb, ctx);
 
719
   _mesa_DeleteHashTable(ss->RenderBuffers);
 
720
#endif
 
721
 
 
722
   /*
 
723
    * Free texture objects (after FBOs since some textures might have
 
724
    * been bound to FBOs).
 
725
    */
 
726
   ASSERT(ctx->Driver.DeleteTexture);
 
727
   /* the default textures */
 
728
   ctx->Driver.DeleteTexture(ctx, ss->Default1D);
 
729
   ctx->Driver.DeleteTexture(ctx, ss->Default2D);
 
730
   ctx->Driver.DeleteTexture(ctx, ss->Default3D);
 
731
   ctx->Driver.DeleteTexture(ctx, ss->DefaultCubeMap);
 
732
   ctx->Driver.DeleteTexture(ctx, ss->DefaultRect);
 
733
   /* all other textures */
 
734
   _mesa_HashDeleteAll(ss->TexObjects, delete_texture_cb, ctx);
 
735
   _mesa_DeleteHashTable(ss->TexObjects);
 
736
 
 
737
   _glthread_DESTROY_MUTEX(ss->Mutex);
 
738
 
 
739
   _mesa_free(ss);
 
740
}
 
741
 
 
742
 
 
743
/**
 
744
 * Initialize fields of gl_current_attrib (aka ctx->Current.*)
 
745
 */
 
746
static void
 
747
_mesa_init_current(GLcontext *ctx)
 
748
{
 
749
   GLuint i;
 
750
 
 
751
   /* Init all to (0,0,0,1) */
 
752
   for (i = 0; i < VERT_ATTRIB_MAX; i++) {
 
753
      ASSIGN_4V( ctx->Current.Attrib[i], 0.0, 0.0, 0.0, 1.0 );
 
754
   }
 
755
 
 
756
   /* redo special cases: */
 
757
   ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_WEIGHT], 1.0, 0.0, 0.0, 0.0 );
 
758
   ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 1.0 );
 
759
   ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 );
 
760
   ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR1], 0.0, 0.0, 0.0, 1.0 );
 
761
   ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR_INDEX], 1.0, 0.0, 0.0, 1.0 );
 
762
   ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_EDGEFLAG], 1.0, 0.0, 0.0, 1.0 );
 
763
}
 
764
 
 
765
 
 
766
/**
 
767
 * Init vertex/fragment program native limits from logical limits.
 
768
 */
 
769
static void
 
770
init_natives(struct gl_program_constants *prog)
 
771
{
 
772
   prog->MaxNativeInstructions = prog->MaxInstructions;
 
773
   prog->MaxNativeAluInstructions = prog->MaxAluInstructions;
 
774
   prog->MaxNativeTexInstructions = prog->MaxTexInstructions;
 
775
   prog->MaxNativeTexIndirections = prog->MaxTexIndirections;
 
776
   prog->MaxNativeAttribs = prog->MaxAttribs;
 
777
   prog->MaxNativeTemps = prog->MaxTemps;
 
778
   prog->MaxNativeAddressRegs = prog->MaxAddressRegs;
 
779
   prog->MaxNativeParameters = prog->MaxParameters;
 
780
}
 
781
 
 
782
 
 
783
/**
 
784
 * Initialize fields of gl_constants (aka ctx->Const.*).
 
785
 * Use defaults from config.h.  The device drivers will often override
 
786
 * some of these values (such as number of texture units).
 
787
 */
 
788
static void 
 
789
_mesa_init_constants(GLcontext *ctx)
 
790
{
 
791
   assert(ctx);
 
792
 
 
793
   assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);
 
794
   assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);
 
795
 
 
796
   assert(MAX_TEXTURE_UNITS >= MAX_TEXTURE_COORD_UNITS);
 
797
   assert(MAX_TEXTURE_UNITS >= MAX_TEXTURE_IMAGE_UNITS);
 
798
 
 
799
   /* Constants, may be overriden (usually only reduced) by device drivers */
 
800
   ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
 
801
   ctx->Const.Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS;
 
802
   ctx->Const.MaxCubeTextureLevels = MAX_CUBE_TEXTURE_LEVELS;
 
803
   ctx->Const.MaxTextureRectSize = MAX_TEXTURE_RECT_SIZE;
 
804
   ctx->Const.MaxTextureCoordUnits = MAX_TEXTURE_COORD_UNITS;
 
805
   ctx->Const.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
 
806
   ctx->Const.MaxTextureUnits = MIN2(ctx->Const.MaxTextureCoordUnits,
 
807
                                     ctx->Const.MaxTextureImageUnits);
 
808
   ctx->Const.MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY;
 
809
   ctx->Const.MaxTextureLodBias = MAX_TEXTURE_LOD_BIAS;
 
810
   ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
 
811
   ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
 
812
   ctx->Const.MinPointSize = MIN_POINT_SIZE;
 
813
   ctx->Const.MaxPointSize = MAX_POINT_SIZE;
 
814
   ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
 
815
   ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
 
816
   ctx->Const.PointSizeGranularity = (GLfloat) POINT_SIZE_GRANULARITY;
 
817
   ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
 
818
   ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
 
819
   ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
 
820
   ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
 
821
   ctx->Const.LineWidthGranularity = (GLfloat) LINE_WIDTH_GRANULARITY;
 
822
   ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
 
823
   ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
 
824
   ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
 
825
   ctx->Const.MaxClipPlanes = MAX_CLIP_PLANES;
 
826
   ctx->Const.MaxLights = MAX_LIGHTS;
 
827
   ctx->Const.MaxShininess = 128.0;
 
828
   ctx->Const.MaxSpotExponent = 128.0;
 
829
   ctx->Const.MaxViewportWidth = MAX_WIDTH;
 
830
   ctx->Const.MaxViewportHeight = MAX_HEIGHT;
 
831
#if FEATURE_ARB_vertex_program
 
832
   ctx->Const.VertexProgram.MaxInstructions = MAX_NV_VERTEX_PROGRAM_INSTRUCTIONS;
 
833
   ctx->Const.VertexProgram.MaxAluInstructions = 0;
 
834
   ctx->Const.VertexProgram.MaxTexInstructions = 0;
 
835
   ctx->Const.VertexProgram.MaxTexIndirections = 0;
 
836
   ctx->Const.VertexProgram.MaxAttribs = MAX_NV_VERTEX_PROGRAM_INPUTS;
 
837
   ctx->Const.VertexProgram.MaxTemps = MAX_PROGRAM_TEMPS;
 
838
   ctx->Const.VertexProgram.MaxParameters = MAX_NV_VERTEX_PROGRAM_PARAMS;
 
839
   ctx->Const.VertexProgram.MaxLocalParams = MAX_PROGRAM_LOCAL_PARAMS;
 
840
   ctx->Const.VertexProgram.MaxEnvParams = MAX_PROGRAM_ENV_PARAMS;
 
841
   ctx->Const.VertexProgram.MaxAddressRegs = MAX_VERTEX_PROGRAM_ADDRESS_REGS;
 
842
   ctx->Const.VertexProgram.MaxUniformComponents = 4 * MAX_UNIFORMS;
 
843
   init_natives(&ctx->Const.VertexProgram);
 
844
#endif
 
845
 
 
846
#if FEATURE_ARB_fragment_program
 
847
   ctx->Const.FragmentProgram.MaxInstructions = MAX_NV_FRAGMENT_PROGRAM_INSTRUCTIONS;
 
848
   ctx->Const.FragmentProgram.MaxAluInstructions = MAX_FRAGMENT_PROGRAM_ALU_INSTRUCTIONS;
 
849
   ctx->Const.FragmentProgram.MaxTexInstructions = MAX_FRAGMENT_PROGRAM_TEX_INSTRUCTIONS;
 
850
   ctx->Const.FragmentProgram.MaxTexIndirections = MAX_FRAGMENT_PROGRAM_TEX_INDIRECTIONS;
 
851
   ctx->Const.FragmentProgram.MaxAttribs = MAX_NV_FRAGMENT_PROGRAM_INPUTS;
 
852
   ctx->Const.FragmentProgram.MaxTemps = MAX_PROGRAM_TEMPS;
 
853
   ctx->Const.FragmentProgram.MaxParameters = MAX_NV_FRAGMENT_PROGRAM_PARAMS;
 
854
   ctx->Const.FragmentProgram.MaxLocalParams = MAX_PROGRAM_LOCAL_PARAMS;
 
855
   ctx->Const.FragmentProgram.MaxEnvParams = MAX_PROGRAM_ENV_PARAMS;
 
856
   ctx->Const.FragmentProgram.MaxAddressRegs = MAX_FRAGMENT_PROGRAM_ADDRESS_REGS;
 
857
   ctx->Const.FragmentProgram.MaxUniformComponents = 4 * MAX_UNIFORMS;
 
858
   init_natives(&ctx->Const.FragmentProgram);
 
859
#endif
 
860
   ctx->Const.MaxProgramMatrices = MAX_PROGRAM_MATRICES;
 
861
   ctx->Const.MaxProgramMatrixStackDepth = MAX_PROGRAM_MATRIX_STACK_DEPTH;
 
862
 
 
863
   /* CheckArrayBounds is overriden by drivers/x11 for X server */
 
864
   ctx->Const.CheckArrayBounds = GL_FALSE;
 
865
 
 
866
   /* GL_ARB_draw_buffers */
 
867
   ctx->Const.MaxDrawBuffers = MAX_DRAW_BUFFERS;
 
868
 
 
869
   /* GL_OES_read_format */
 
870
   ctx->Const.ColorReadFormat = GL_RGBA;
 
871
   ctx->Const.ColorReadType = GL_UNSIGNED_BYTE;
 
872
 
 
873
#if FEATURE_EXT_framebuffer_object
 
874
   ctx->Const.MaxColorAttachments = MAX_COLOR_ATTACHMENTS;
 
875
   ctx->Const.MaxRenderbufferSize = MAX_WIDTH;
 
876
#endif
 
877
 
 
878
#if FEATURE_ARB_vertex_shader
 
879
   ctx->Const.MaxVertexTextureImageUnits = MAX_VERTEX_TEXTURE_IMAGE_UNITS;
 
880
   ctx->Const.MaxVarying = MAX_VARYING;
 
881
#endif
 
882
 
 
883
   /* sanity checks */
 
884
   ASSERT(ctx->Const.MaxTextureUnits == MIN2(ctx->Const.MaxTextureImageUnits,
 
885
                                             ctx->Const.MaxTextureCoordUnits));
 
886
   ASSERT(ctx->Const.FragmentProgram.MaxLocalParams <= MAX_PROGRAM_LOCAL_PARAMS);
 
887
   ASSERT(ctx->Const.VertexProgram.MaxLocalParams <= MAX_PROGRAM_LOCAL_PARAMS);
 
888
 
 
889
   ASSERT(MAX_NV_FRAGMENT_PROGRAM_TEMPS <= MAX_PROGRAM_TEMPS);
 
890
   ASSERT(MAX_NV_VERTEX_PROGRAM_TEMPS <= MAX_PROGRAM_TEMPS);
 
891
   ASSERT(MAX_NV_VERTEX_PROGRAM_INPUTS <= VERT_ATTRIB_MAX);
 
892
   ASSERT(MAX_NV_VERTEX_PROGRAM_OUTPUTS <= VERT_RESULT_MAX);
 
893
}
 
894
 
 
895
 
 
896
/**
 
897
 * Do some sanity checks on the limits/constants for the given context.
 
898
 * Only called the first time a context is bound.
 
899
 */
 
900
static void
 
901
check_context_limits(GLcontext *ctx)
 
902
{
 
903
   /* Many context limits/constants are limited by the size of
 
904
    * internal arrays.
 
905
    */
 
906
   assert(ctx->Const.MaxTextureImageUnits <= MAX_TEXTURE_IMAGE_UNITS);
 
907
   assert(ctx->Const.MaxTextureCoordUnits <= MAX_TEXTURE_COORD_UNITS);
 
908
   assert(ctx->Const.MaxTextureUnits <= MAX_TEXTURE_IMAGE_UNITS);
 
909
   assert(ctx->Const.MaxTextureUnits <= MAX_TEXTURE_COORD_UNITS);
 
910
 
 
911
   assert(ctx->Const.MaxViewportWidth <= MAX_WIDTH);
 
912
   assert(ctx->Const.MaxViewportHeight <= MAX_WIDTH);
 
913
 
 
914
   /* make sure largest texture image is <= MAX_WIDTH in size */
 
915
   assert((1 << (ctx->Const.MaxTextureLevels -1 )) <= MAX_WIDTH);
 
916
   assert((1 << (ctx->Const.MaxCubeTextureLevels -1 )) <= MAX_WIDTH);
 
917
   assert((1 << (ctx->Const.Max3DTextureLevels -1 )) <= MAX_WIDTH);
 
918
 
 
919
   assert(ctx->Const.MaxDrawBuffers <= MAX_DRAW_BUFFERS);
 
920
 
 
921
   /* XXX probably add more tests */
 
922
}
 
923
 
 
924
 
 
925
/**
 
926
 * Initialize the attribute groups in a GL context.
 
927
 *
 
928
 * \param ctx GL context.
 
929
 *
 
930
 * Initializes all the attributes, calling the respective <tt>init*</tt>
 
931
 * functions for the more complex data structures.
 
932
 */
 
933
static GLboolean
 
934
init_attrib_groups(GLcontext *ctx)
 
935
{
 
936
   assert(ctx);
 
937
 
 
938
   /* Constants */
 
939
   _mesa_init_constants( ctx );
 
940
 
 
941
   /* Extensions */
 
942
   _mesa_init_extensions( ctx );
 
943
 
 
944
   /* Attribute Groups */
 
945
   _mesa_init_accum( ctx );
 
946
   _mesa_init_attrib( ctx );
 
947
   _mesa_init_buffer_objects( ctx );
 
948
   _mesa_init_color( ctx );
 
949
   _mesa_init_colortables( ctx );
 
950
   _mesa_init_current( ctx );
 
951
   _mesa_init_depth( ctx );
 
952
   _mesa_init_debug( ctx );
 
953
   _mesa_init_display_list( ctx );
 
954
   _mesa_init_eval( ctx );
 
955
   _mesa_init_feedback( ctx );
 
956
   _mesa_init_fog( ctx );
 
957
   _mesa_init_histogram( ctx );
 
958
   _mesa_init_hint( ctx );
 
959
   _mesa_init_line( ctx );
 
960
   _mesa_init_lighting( ctx );
 
961
   _mesa_init_matrix( ctx );
 
962
   _mesa_init_multisample( ctx );
 
963
   _mesa_init_pixel( ctx );
 
964
   _mesa_init_point( ctx );
 
965
   _mesa_init_polygon( ctx );
 
966
   _mesa_init_program( ctx );
 
967
   _mesa_init_query( ctx );
 
968
   _mesa_init_rastpos( ctx );
 
969
   _mesa_init_scissor( ctx );
 
970
   _mesa_init_shader_state( ctx );
 
971
   _mesa_init_stencil( ctx );
 
972
   _mesa_init_transform( ctx );
 
973
   _mesa_init_varray( ctx );
 
974
   _mesa_init_viewport( ctx );
 
975
 
 
976
   if (!_mesa_init_texture( ctx ))
 
977
      return GL_FALSE;
 
978
 
 
979
   _mesa_init_texture_s3tc( ctx );
 
980
   _mesa_init_texture_fxt1( ctx );
 
981
 
 
982
   /* Miscellaneous */
 
983
   ctx->NewState = _NEW_ALL;
 
984
   ctx->ErrorValue = (GLenum) GL_NO_ERROR;
 
985
 
 
986
   return GL_TRUE;
 
987
}
 
988
 
 
989
 
 
990
/**
 
991
 * This is the default function we plug into all dispatch table slots
 
992
 * This helps prevents a segfault when someone calls a GL function without
 
993
 * first checking if the extension's supported.
 
994
 */
 
995
static int
 
996
generic_nop(void)
 
997
{
 
998
   _mesa_problem(NULL, "User called no-op dispatch function (an unsupported extension function?)");
 
999
   return 0;
 
1000
}
 
1001
 
 
1002
 
 
1003
/**
 
1004
 * Allocate and initialize a new dispatch table.
 
1005
 */
 
1006
static struct _glapi_table *
 
1007
alloc_dispatch_table(void)
 
1008
{
 
1009
   /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
 
1010
    * In practice, this'll be the same for stand-alone Mesa.  But for DRI
 
1011
    * Mesa we do this to accomodate different versions of libGL and various
 
1012
    * DRI drivers.
 
1013
    */
 
1014
   GLint numEntries = MAX2(_glapi_get_dispatch_table_size(),
 
1015
                           sizeof(struct _glapi_table) / sizeof(_glapi_proc));
 
1016
   struct _glapi_table *table =
 
1017
      (struct _glapi_table *) _mesa_malloc(numEntries * sizeof(_glapi_proc));
 
1018
   if (table) {
 
1019
      _glapi_proc *entry = (_glapi_proc *) table;
 
1020
      GLint i;
 
1021
      for (i = 0; i < numEntries; i++) {
 
1022
         entry[i] = (_glapi_proc) generic_nop;
 
1023
      }
 
1024
   }
 
1025
   return table;
 
1026
}
 
1027
 
 
1028
 
 
1029
/**
 
1030
 * Initialize a GLcontext struct (rendering context).
 
1031
 *
 
1032
 * This includes allocating all the other structs and arrays which hang off of
 
1033
 * the context by pointers.
 
1034
 * Note that the driver needs to pass in its dd_function_table here since
 
1035
 * we need to at least call driverFunctions->NewTextureObject to create the
 
1036
 * default texture objects.
 
1037
 * 
 
1038
 * Called by _mesa_create_context().
 
1039
 *
 
1040
 * Performs the imports and exports callback tables initialization, and
 
1041
 * miscellaneous one-time initializations. If no shared context is supplied one
 
1042
 * is allocated, and increase its reference count.  Setups the GL API dispatch
 
1043
 * tables.  Initialize the TNL module. Sets the maximum Z buffer depth.
 
1044
 * Finally queries the \c MESA_DEBUG and \c MESA_VERBOSE environment variables
 
1045
 * for debug flags.
 
1046
 *
 
1047
 * \param ctx the context to initialize
 
1048
 * \param visual describes the visual attributes for this context
 
1049
 * \param share_list points to context to share textures, display lists,
 
1050
 *        etc with, or NULL
 
1051
 * \param driverFunctions table of device driver functions for this context
 
1052
 *        to use
 
1053
 * \param driverContext pointer to driver-specific context data
 
1054
 */
 
1055
GLboolean
 
1056
_mesa_initialize_context(GLcontext *ctx,
 
1057
                         const GLvisual *visual,
 
1058
                         GLcontext *share_list,
 
1059
                         const struct dd_function_table *driverFunctions,
 
1060
                         void *driverContext)
 
1061
{
 
1062
   ASSERT(driverContext);
 
1063
   assert(driverFunctions->NewTextureObject);
 
1064
   assert(driverFunctions->FreeTexImageData);
 
1065
 
 
1066
   /* misc one-time initializations */
 
1067
   one_time_init(ctx);
 
1068
 
 
1069
   ctx->Visual = *visual;
 
1070
   ctx->DrawBuffer = NULL;
 
1071
   ctx->ReadBuffer = NULL;
 
1072
   ctx->WinSysDrawBuffer = NULL;
 
1073
   ctx->WinSysReadBuffer = NULL;
 
1074
 
 
1075
   /* Plug in driver functions and context pointer here.
 
1076
    * This is important because when we call alloc_shared_state() below
 
1077
    * we'll call ctx->Driver.NewTextureObject() to create the default
 
1078
    * textures.
 
1079
    */
 
1080
   ctx->Driver = *driverFunctions;
 
1081
   ctx->DriverCtx = driverContext;
 
1082
 
 
1083
   if (share_list) {
 
1084
      /* share state with another context */
 
1085
      ctx->Shared = share_list->Shared;
 
1086
   }
 
1087
   else {
 
1088
      /* allocate new, unshared state */
 
1089
      if (!alloc_shared_state( ctx )) {
 
1090
         return GL_FALSE;
 
1091
      }
 
1092
   }
 
1093
   _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
 
1094
   ctx->Shared->RefCount++;
 
1095
   _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
 
1096
 
 
1097
   if (!init_attrib_groups( ctx )) {
 
1098
      free_shared_state(ctx, ctx->Shared);
 
1099
      return GL_FALSE;
 
1100
   }
 
1101
 
 
1102
   /* setup the API dispatch tables */
 
1103
   ctx->Exec = alloc_dispatch_table();
 
1104
   ctx->Save = alloc_dispatch_table();
 
1105
   if (!ctx->Exec || !ctx->Save) {
 
1106
      free_shared_state(ctx, ctx->Shared);
 
1107
      if (ctx->Exec)
 
1108
         _mesa_free(ctx->Exec);
 
1109
   }
 
1110
   _mesa_init_exec_table(ctx->Exec);
 
1111
   ctx->CurrentDispatch = ctx->Exec;
 
1112
#if _HAVE_FULL_GL
 
1113
   _mesa_init_dlist_table(ctx->Save);
 
1114
   _mesa_install_save_vtxfmt( ctx, &ctx->ListState.ListVtxfmt );
 
1115
   /* Neutral tnl module stuff */
 
1116
   _mesa_init_exec_vtxfmt( ctx ); 
 
1117
   ctx->TnlModule.Current = NULL;
 
1118
   ctx->TnlModule.SwapCount = 0;
 
1119
#endif
 
1120
 
 
1121
   ctx->FragmentProgram._MaintainTexEnvProgram
 
1122
      = (_mesa_getenv("MESA_TEX_PROG") != NULL);
 
1123
   ctx->FragmentProgram._UseTexEnvProgram = ctx->FragmentProgram._MaintainTexEnvProgram;
 
1124
 
 
1125
   ctx->VertexProgram._MaintainTnlProgram
 
1126
      = (_mesa_getenv("MESA_TNL_PROG") != NULL);
 
1127
   if (ctx->VertexProgram._MaintainTnlProgram) {
 
1128
      /* this is required... */
 
1129
      ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
 
1130
   }
 
1131
 
 
1132
   ctx->FirstTimeCurrent = GL_TRUE;
 
1133
 
 
1134
   return GL_TRUE;
 
1135
}
 
1136
 
 
1137
 
 
1138
/**
 
1139
 * Allocate and initialize a GLcontext structure.
 
1140
 * Note that the driver needs to pass in its dd_function_table here since
 
1141
 * we need to at least call driverFunctions->NewTextureObject to initialize
 
1142
 * the rendering context.
 
1143
 *
 
1144
 * \param visual a GLvisual pointer (we copy the struct contents)
 
1145
 * \param share_list another context to share display lists with or NULL
 
1146
 * \param driverFunctions points to the dd_function_table into which the
 
1147
 *        driver has plugged in all its special functions.
 
1148
 * \param driverCtx points to the device driver's private context state
 
1149
 * 
 
1150
 * \return pointer to a new __GLcontextRec or NULL if error.
 
1151
 */
 
1152
GLcontext *
 
1153
_mesa_create_context(const GLvisual *visual,
 
1154
                     GLcontext *share_list,
 
1155
                     const struct dd_function_table *driverFunctions,
 
1156
                     void *driverContext)
 
1157
{
 
1158
   GLcontext *ctx;
 
1159
 
 
1160
   ASSERT(visual);
 
1161
   ASSERT(driverContext);
 
1162
 
 
1163
   ctx = (GLcontext *) _mesa_calloc(sizeof(GLcontext));
 
1164
   if (!ctx)
 
1165
      return NULL;
 
1166
 
 
1167
   if (_mesa_initialize_context(ctx, visual, share_list,
 
1168
                                driverFunctions, driverContext)) {
 
1169
      return ctx;
 
1170
   }
 
1171
   else {
 
1172
      _mesa_free(ctx);
 
1173
      return NULL;
 
1174
   }
 
1175
}
 
1176
 
 
1177
 
 
1178
/**
 
1179
 * Free the data associated with the given context.
 
1180
 * 
 
1181
 * But doesn't free the GLcontext struct itself.
 
1182
 *
 
1183
 * \sa _mesa_initialize_context() and init_attrib_groups().
 
1184
 */
 
1185
void
 
1186
_mesa_free_context_data( GLcontext *ctx )
 
1187
{
 
1188
   if (!_mesa_get_current_context()){
 
1189
      /* No current context, but we may need one in order to delete
 
1190
       * texture objs, etc.  So temporarily bind the context now.
 
1191
       */
 
1192
      _mesa_make_current(ctx, NULL, NULL);
 
1193
   }
 
1194
 
 
1195
   /* unreference WinSysDraw/Read buffers */
 
1196
   _mesa_unreference_framebuffer(&ctx->WinSysDrawBuffer);
 
1197
   _mesa_unreference_framebuffer(&ctx->WinSysReadBuffer);
 
1198
   _mesa_unreference_framebuffer(&ctx->DrawBuffer);
 
1199
   _mesa_unreference_framebuffer(&ctx->ReadBuffer);
 
1200
 
 
1201
   _mesa_free_attrib_data(ctx);
 
1202
   _mesa_free_lighting_data( ctx );
 
1203
   _mesa_free_eval_data( ctx );
 
1204
   _mesa_free_texture_data( ctx );
 
1205
   _mesa_free_matrix_data( ctx );
 
1206
   _mesa_free_viewport_data( ctx );
 
1207
   _mesa_free_colortables_data( ctx );
 
1208
   _mesa_free_program_data(ctx);
 
1209
   _mesa_free_shader_state(ctx);
 
1210
   _mesa_free_query_data(ctx);
 
1211
 
 
1212
#if FEATURE_ARB_vertex_buffer_object
 
1213
   _mesa_delete_buffer_object(ctx, ctx->Array.NullBufferObj);
 
1214
#endif
 
1215
   _mesa_delete_array_object(ctx, ctx->Array.DefaultArrayObj);
 
1216
 
 
1217
   /* free dispatch tables */
 
1218
   _mesa_free(ctx->Exec);
 
1219
   _mesa_free(ctx->Save);
 
1220
 
 
1221
   /* Shared context state (display lists, textures, etc) */
 
1222
   _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
 
1223
   ctx->Shared->RefCount--;
 
1224
   assert(ctx->Shared->RefCount >= 0);
 
1225
   _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
 
1226
   if (ctx->Shared->RefCount == 0) {
 
1227
      /* free shared state */
 
1228
      free_shared_state( ctx, ctx->Shared );
 
1229
   }
 
1230
 
 
1231
   if (ctx->Extensions.String)
 
1232
      _mesa_free((void *) ctx->Extensions.String);
 
1233
 
 
1234
   /* unbind the context if it's currently bound */
 
1235
   if (ctx == _mesa_get_current_context()) {
 
1236
      _mesa_make_current(NULL, NULL, NULL);
 
1237
   }
 
1238
}
 
1239
 
 
1240
 
 
1241
/**
 
1242
 * Destroy a GLcontext structure.
 
1243
 *
 
1244
 * \param ctx GL context.
 
1245
 * 
 
1246
 * Calls _mesa_free_context_data() and frees the GLcontext structure itself.
 
1247
 */
 
1248
void
 
1249
_mesa_destroy_context( GLcontext *ctx )
 
1250
{
 
1251
   if (ctx) {
 
1252
      _mesa_free_context_data(ctx);
 
1253
      _mesa_free( (void *) ctx );
 
1254
   }
 
1255
}
 
1256
 
 
1257
 
 
1258
#if _HAVE_FULL_GL
 
1259
/**
 
1260
 * Copy attribute groups from one context to another.
 
1261
 * 
 
1262
 * \param src source context
 
1263
 * \param dst destination context
 
1264
 * \param mask bitwise OR of GL_*_BIT flags
 
1265
 *
 
1266
 * According to the bits specified in \p mask, copies the corresponding
 
1267
 * attributes from \p src into \p dst.  For many of the attributes a simple \c
 
1268
 * memcpy is not enough due to the existence of internal pointers in their data
 
1269
 * structures.
 
1270
 */
 
1271
void
 
1272
_mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
 
1273
{
 
1274
   if (mask & GL_ACCUM_BUFFER_BIT) {
 
1275
      /* OK to memcpy */
 
1276
      dst->Accum = src->Accum;
 
1277
   }
 
1278
   if (mask & GL_COLOR_BUFFER_BIT) {
 
1279
      /* OK to memcpy */
 
1280
      dst->Color = src->Color;
 
1281
   }
 
1282
   if (mask & GL_CURRENT_BIT) {
 
1283
      /* OK to memcpy */
 
1284
      dst->Current = src->Current;
 
1285
   }
 
1286
   if (mask & GL_DEPTH_BUFFER_BIT) {
 
1287
      /* OK to memcpy */
 
1288
      dst->Depth = src->Depth;
 
1289
   }
 
1290
   if (mask & GL_ENABLE_BIT) {
 
1291
      /* no op */
 
1292
   }
 
1293
   if (mask & GL_EVAL_BIT) {
 
1294
      /* OK to memcpy */
 
1295
      dst->Eval = src->Eval;
 
1296
   }
 
1297
   if (mask & GL_FOG_BIT) {
 
1298
      /* OK to memcpy */
 
1299
      dst->Fog = src->Fog;
 
1300
   }
 
1301
   if (mask & GL_HINT_BIT) {
 
1302
      /* OK to memcpy */
 
1303
      dst->Hint = src->Hint;
 
1304
   }
 
1305
   if (mask & GL_LIGHTING_BIT) {
 
1306
      GLuint i;
 
1307
      /* begin with memcpy */
 
1308
      dst->Light = src->Light;
 
1309
      /* fixup linked lists to prevent pointer insanity */
 
1310
      make_empty_list( &(dst->Light.EnabledList) );
 
1311
      for (i = 0; i < MAX_LIGHTS; i++) {
 
1312
         if (dst->Light.Light[i].Enabled) {
 
1313
            insert_at_tail(&(dst->Light.EnabledList), &(dst->Light.Light[i]));
 
1314
         }
 
1315
      }
 
1316
   }
 
1317
   if (mask & GL_LINE_BIT) {
 
1318
      /* OK to memcpy */
 
1319
      dst->Line = src->Line;
 
1320
   }
 
1321
   if (mask & GL_LIST_BIT) {
 
1322
      /* OK to memcpy */
 
1323
      dst->List = src->List;
 
1324
   }
 
1325
   if (mask & GL_PIXEL_MODE_BIT) {
 
1326
      /* OK to memcpy */
 
1327
      dst->Pixel = src->Pixel;
 
1328
   }
 
1329
   if (mask & GL_POINT_BIT) {
 
1330
      /* OK to memcpy */
 
1331
      dst->Point = src->Point;
 
1332
   }
 
1333
   if (mask & GL_POLYGON_BIT) {
 
1334
      /* OK to memcpy */
 
1335
      dst->Polygon = src->Polygon;
 
1336
   }
 
1337
   if (mask & GL_POLYGON_STIPPLE_BIT) {
 
1338
      /* Use loop instead of MEMCPY due to problem with Portland Group's
 
1339
       * C compiler.  Reported by John Stone.
 
1340
       */
 
1341
      GLuint i;
 
1342
      for (i = 0; i < 32; i++) {
 
1343
         dst->PolygonStipple[i] = src->PolygonStipple[i];
 
1344
      }
 
1345
   }
 
1346
   if (mask & GL_SCISSOR_BIT) {
 
1347
      /* OK to memcpy */
 
1348
      dst->Scissor = src->Scissor;
 
1349
   }
 
1350
   if (mask & GL_STENCIL_BUFFER_BIT) {
 
1351
      /* OK to memcpy */
 
1352
      dst->Stencil = src->Stencil;
 
1353
   }
 
1354
   if (mask & GL_TEXTURE_BIT) {
 
1355
      /* Cannot memcpy because of pointers */
 
1356
      _mesa_copy_texture_state(src, dst);
 
1357
   }
 
1358
   if (mask & GL_TRANSFORM_BIT) {
 
1359
      /* OK to memcpy */
 
1360
      dst->Transform = src->Transform;
 
1361
   }
 
1362
   if (mask & GL_VIEWPORT_BIT) {
 
1363
      /* Cannot use memcpy, because of pointers in GLmatrix _WindowMap */
 
1364
      dst->Viewport.X = src->Viewport.X;
 
1365
      dst->Viewport.Y = src->Viewport.Y;
 
1366
      dst->Viewport.Width = src->Viewport.Width;
 
1367
      dst->Viewport.Height = src->Viewport.Height;
 
1368
      dst->Viewport.Near = src->Viewport.Near;
 
1369
      dst->Viewport.Far = src->Viewport.Far;
 
1370
      _math_matrix_copy(&dst->Viewport._WindowMap, &src->Viewport._WindowMap);
 
1371
   }
 
1372
 
 
1373
   /* XXX FIXME:  Call callbacks?
 
1374
    */
 
1375
   dst->NewState = _NEW_ALL;
 
1376
}
 
1377
#endif
 
1378
 
 
1379
 
 
1380
/**
 
1381
 * Check if the given context can render into the given framebuffer
 
1382
 * by checking visual attributes.
 
1383
 *
 
1384
 * XXX this may go away someday because we're moving toward more freedom
 
1385
 * in binding contexts to drawables with different visual attributes.
 
1386
 * The GL_EXT_f_b_o extension is prompting some of that.
 
1387
 *
 
1388
 * \return GL_TRUE if compatible, GL_FALSE otherwise.
 
1389
 */
 
1390
static GLboolean 
 
1391
check_compatible(const GLcontext *ctx, const GLframebuffer *buffer)
 
1392
{
 
1393
   const GLvisual *ctxvis = &ctx->Visual;
 
1394
   const GLvisual *bufvis = &buffer->Visual;
 
1395
 
 
1396
   if (ctxvis == bufvis)
 
1397
      return GL_TRUE;
 
1398
 
 
1399
   if (ctxvis->rgbMode != bufvis->rgbMode)
 
1400
      return GL_FALSE;
 
1401
#if 0
 
1402
   /* disabling this fixes the fgl_glxgears pbuffer demo */
 
1403
   if (ctxvis->doubleBufferMode && !bufvis->doubleBufferMode)
 
1404
      return GL_FALSE;
 
1405
#endif
 
1406
   if (ctxvis->stereoMode && !bufvis->stereoMode)
 
1407
      return GL_FALSE;
 
1408
   if (ctxvis->haveAccumBuffer && !bufvis->haveAccumBuffer)
 
1409
      return GL_FALSE;
 
1410
   if (ctxvis->haveDepthBuffer && !bufvis->haveDepthBuffer)
 
1411
      return GL_FALSE;
 
1412
   if (ctxvis->haveStencilBuffer && !bufvis->haveStencilBuffer)
 
1413
      return GL_FALSE;
 
1414
   if (ctxvis->redMask && ctxvis->redMask != bufvis->redMask)
 
1415
      return GL_FALSE;
 
1416
   if (ctxvis->greenMask && ctxvis->greenMask != bufvis->greenMask)
 
1417
      return GL_FALSE;
 
1418
   if (ctxvis->blueMask && ctxvis->blueMask != bufvis->blueMask)
 
1419
      return GL_FALSE;
 
1420
#if 0
 
1421
   /* disabled (see bug 11161) */
 
1422
   if (ctxvis->depthBits && ctxvis->depthBits != bufvis->depthBits)
 
1423
      return GL_FALSE;
 
1424
#endif
 
1425
   if (ctxvis->stencilBits && ctxvis->stencilBits != bufvis->stencilBits)
 
1426
      return GL_FALSE;
 
1427
 
 
1428
   return GL_TRUE;
 
1429
}
 
1430
 
 
1431
 
 
1432
/**
 
1433
 * Do one-time initialization for the given framebuffer.  Specifically,
 
1434
 * ask the driver for the window's current size and update the framebuffer
 
1435
 * object to match.
 
1436
 * Really, the device driver should totally take care of this.
 
1437
 */
 
1438
static void
 
1439
initialize_framebuffer_size(GLcontext *ctx, GLframebuffer *fb)
 
1440
{
 
1441
   GLuint width, height;
 
1442
   if (ctx->Driver.GetBufferSize) {
 
1443
      ctx->Driver.GetBufferSize(fb, &width, &height);
 
1444
      if (ctx->Driver.ResizeBuffers)
 
1445
         ctx->Driver.ResizeBuffers(ctx, fb, width, height);
 
1446
      fb->Initialized = GL_TRUE;
 
1447
   }
 
1448
}
 
1449
 
 
1450
 
 
1451
/**
 
1452
 * Bind the given context to the given drawBuffer and readBuffer and
 
1453
 * make it the current context for the calling thread.
 
1454
 * We'll render into the drawBuffer and read pixels from the
 
1455
 * readBuffer (i.e. glRead/CopyPixels, glCopyTexImage, etc).
 
1456
 *
 
1457
 * We check that the context's and framebuffer's visuals are compatible
 
1458
 * and return immediately if they're not.
 
1459
 *
 
1460
 * \param newCtx  the new GL context. If NULL then there will be no current GL
 
1461
 *                context.
 
1462
 * \param drawBuffer  the drawing framebuffer
 
1463
 * \param readBuffer  the reading framebuffer
 
1464
 */
 
1465
void
 
1466
_mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer,
 
1467
                    GLframebuffer *readBuffer )
 
1468
{
 
1469
   if (MESA_VERBOSE & VERBOSE_API)
 
1470
      _mesa_debug(newCtx, "_mesa_make_current()\n");
 
1471
 
 
1472
   /* Check that the context's and framebuffer's visuals are compatible.
 
1473
    */
 
1474
   if (newCtx && drawBuffer && newCtx->WinSysDrawBuffer != drawBuffer) {
 
1475
      if (!check_compatible(newCtx, drawBuffer)) {
 
1476
         _mesa_warning(newCtx,
 
1477
              "MakeCurrent: incompatible visuals for context and drawbuffer");
 
1478
         return;
 
1479
      }
 
1480
   }
 
1481
   if (newCtx && readBuffer && newCtx->WinSysReadBuffer != readBuffer) {
 
1482
      if (!check_compatible(newCtx, readBuffer)) {
 
1483
         _mesa_warning(newCtx,
 
1484
              "MakeCurrent: incompatible visuals for context and readbuffer");
 
1485
         return;
 
1486
      }
 
1487
   }
 
1488
 
 
1489
   /* We used to call _glapi_check_multithread() here.  Now do it in drivers */
 
1490
   _glapi_set_context((void *) newCtx);
 
1491
   ASSERT(_mesa_get_current_context() == newCtx);
 
1492
 
 
1493
   if (!newCtx) {
 
1494
      _glapi_set_dispatch(NULL);  /* none current */
 
1495
   }
 
1496
   else {
 
1497
      _glapi_set_dispatch(newCtx->CurrentDispatch);
 
1498
 
 
1499
      if (drawBuffer && readBuffer) {
 
1500
         /* TODO: check if newCtx and buffer's visual match??? */
 
1501
 
 
1502
         ASSERT(drawBuffer->Name == 0);
 
1503
         ASSERT(readBuffer->Name == 0);
 
1504
         _mesa_reference_framebuffer(&newCtx->WinSysDrawBuffer, drawBuffer);
 
1505
         _mesa_reference_framebuffer(&newCtx->WinSysReadBuffer, readBuffer);
 
1506
 
 
1507
         /*
 
1508
          * Only set the context's Draw/ReadBuffer fields if they're NULL
 
1509
          * or not bound to a user-created FBO.
 
1510
          */
 
1511
         if (!newCtx->DrawBuffer || newCtx->DrawBuffer->Name == 0) {
 
1512
            _mesa_reference_framebuffer(&newCtx->DrawBuffer, drawBuffer);
 
1513
         }
 
1514
         if (!newCtx->ReadBuffer || newCtx->ReadBuffer->Name == 0) {
 
1515
            _mesa_reference_framebuffer(&newCtx->ReadBuffer, readBuffer);
 
1516
         }
 
1517
 
 
1518
         newCtx->NewState |= _NEW_BUFFERS;
 
1519
 
 
1520
#if 1
 
1521
         /* We want to get rid of these lines: */
 
1522
 
 
1523
#if _HAVE_FULL_GL
 
1524
         if (!drawBuffer->Initialized) {
 
1525
            initialize_framebuffer_size(newCtx, drawBuffer);
 
1526
         }
 
1527
         if (readBuffer != drawBuffer && !readBuffer->Initialized) {
 
1528
            initialize_framebuffer_size(newCtx, readBuffer);
 
1529
         }
 
1530
 
 
1531
         _mesa_resizebuffers(newCtx);
 
1532
#endif
 
1533
 
 
1534
#else
 
1535
         /* We want the drawBuffer and readBuffer to be initialized by
 
1536
          * the driver.
 
1537
          * This generally means the Width and Height match the actual
 
1538
          * window size and the renderbuffers (both hardware and software
 
1539
          * based) are allocated to match.  The later can generally be
 
1540
          * done with a call to _mesa_resize_framebuffer().
 
1541
          *
 
1542
          * It's theoretically possible for a buffer to have zero width
 
1543
          * or height, but for now, assert check that the driver did what's
 
1544
          * expected of it.
 
1545
          */
 
1546
         ASSERT(drawBuffer->Width > 0);
 
1547
         ASSERT(drawBuffer->Height > 0);
 
1548
#endif
 
1549
 
 
1550
         if (newCtx->FirstTimeCurrent) {
 
1551
            /* set initial viewport and scissor size now */
 
1552
            _mesa_set_viewport(newCtx, 0, 0,
 
1553
                               drawBuffer->Width, drawBuffer->Height);
 
1554
            _mesa_set_scissor(newCtx, 0, 0,
 
1555
                              drawBuffer->Width, drawBuffer->Height );
 
1556
            check_context_limits(newCtx);
 
1557
         }
 
1558
      }
 
1559
 
 
1560
      /* We can use this to help debug user's problems.  Tell them to set
 
1561
       * the MESA_INFO env variable before running their app.  Then the
 
1562
       * first time each context is made current we'll print some useful
 
1563
       * information.
 
1564
       */
 
1565
      if (newCtx->FirstTimeCurrent) {
 
1566
         if (_mesa_getenv("MESA_INFO")) {
 
1567
            _mesa_print_info();
 
1568
         }
 
1569
         newCtx->FirstTimeCurrent = GL_FALSE;
 
1570
      }
 
1571
   }
 
1572
}
 
1573
 
 
1574
 
 
1575
/**
 
1576
 * Make context 'ctx' share the display lists, textures and programs
 
1577
 * that are associated with 'ctxToShare'.
 
1578
 * Any display lists, textures or programs associated with 'ctx' will
 
1579
 * be deleted if nobody else is sharing them.
 
1580
 */
 
1581
GLboolean
 
1582
_mesa_share_state(GLcontext *ctx, GLcontext *ctxToShare)
 
1583
{
 
1584
   if (ctx && ctxToShare && ctx->Shared && ctxToShare->Shared) {
 
1585
      ctx->Shared->RefCount--;
 
1586
      if (ctx->Shared->RefCount == 0) {
 
1587
         free_shared_state(ctx, ctx->Shared);
 
1588
      }
 
1589
      ctx->Shared = ctxToShare->Shared;
 
1590
      ctx->Shared->RefCount++;
 
1591
      return GL_TRUE;
 
1592
   }
 
1593
   else {
 
1594
      return GL_FALSE;
 
1595
   }
 
1596
}
 
1597
 
 
1598
 
 
1599
 
 
1600
/**
 
1601
 * \return pointer to the current GL context for this thread.
 
1602
 * 
 
1603
 * Calls _glapi_get_context(). This isn't the fastest way to get the current
 
1604
 * context.  If you need speed, see the #GET_CURRENT_CONTEXT macro in
 
1605
 * context.h.
 
1606
 */
 
1607
GLcontext *
 
1608
_mesa_get_current_context( void )
 
1609
{
 
1610
   return (GLcontext *) _glapi_get_context();
 
1611
}
 
1612
 
 
1613
 
 
1614
/**
 
1615
 * Get context's current API dispatch table.
 
1616
 *
 
1617
 * It'll either be the immediate-mode execute dispatcher or the display list
 
1618
 * compile dispatcher.
 
1619
 * 
 
1620
 * \param ctx GL context.
 
1621
 *
 
1622
 * \return pointer to dispatch_table.
 
1623
 *
 
1624
 * Simply returns __GLcontextRec::CurrentDispatch.
 
1625
 */
 
1626
struct _glapi_table *
 
1627
_mesa_get_dispatch(GLcontext *ctx)
 
1628
{
 
1629
   return ctx->CurrentDispatch;
 
1630
}
 
1631
 
 
1632
/*@}*/
 
1633
 
 
1634
 
 
1635
/**********************************************************************/
 
1636
/** \name Miscellaneous functions                                     */
 
1637
/**********************************************************************/
 
1638
/*@{*/
 
1639
 
 
1640
/**
 
1641
 * Record an error.
 
1642
 *
 
1643
 * \param ctx GL context.
 
1644
 * \param error error code.
 
1645
 * 
 
1646
 * Records the given error code and call the driver's dd_function_table::Error
 
1647
 * function if defined.
 
1648
 *
 
1649
 * \sa
 
1650
 * This is called via _mesa_error().
 
1651
 */
 
1652
void
 
1653
_mesa_record_error(GLcontext *ctx, GLenum error)
 
1654
{
 
1655
   if (!ctx)
 
1656
      return;
 
1657
 
 
1658
   if (ctx->ErrorValue == GL_NO_ERROR) {
 
1659
      ctx->ErrorValue = error;
 
1660
   }
 
1661
 
 
1662
   /* Call device driver's error handler, if any.  This is used on the Mac. */
 
1663
   if (ctx->Driver.Error) {
 
1664
      ctx->Driver.Error(ctx);
 
1665
   }
 
1666
}
 
1667
 
 
1668
 
 
1669
/**
 
1670
 * Execute glFinish().
 
1671
 *
 
1672
 * Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the
 
1673
 * dd_function_table::Finish driver callback, if not NULL.
 
1674
 */
 
1675
void GLAPIENTRY
 
1676
_mesa_Finish(void)
 
1677
{
 
1678
   GET_CURRENT_CONTEXT(ctx);
 
1679
   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
1680
   if (ctx->Driver.Finish) {
 
1681
      ctx->Driver.Finish(ctx);
 
1682
   }
 
1683
}
 
1684
 
 
1685
 
 
1686
/**
 
1687
 * Execute glFlush().
 
1688
 *
 
1689
 * Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the
 
1690
 * dd_function_table::Flush driver callback, if not NULL.
 
1691
 */
 
1692
void GLAPIENTRY
 
1693
_mesa_Flush(void)
 
1694
{
 
1695
   GET_CURRENT_CONTEXT(ctx);
 
1696
   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
1697
   if (ctx->Driver.Flush) {
 
1698
      ctx->Driver.Flush(ctx);
 
1699
   }
 
1700
}
 
1701
 
 
1702
 
 
1703
/*@}*/