Replace add_newer_entrypoints (src/mesa/main/context.c) with
[mesa.git] / src / mesa / main / context.c
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: 6.3
10 *
11 * Copyright (C) 1999-2005 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 "attrib.h"
83 #include "blend.h"
84 #include "buffers.h"
85 #include "bufferobj.h"
86 #include "colortab.h"
87 #include "context.h"
88 #include "debug.h"
89 #include "depth.h"
90 #include "dlist.h"
91 #include "eval.h"
92 #include "enums.h"
93 #include "extensions.h"
94 #include "fbobject.h"
95 #include "feedback.h"
96 #include "fog.h"
97 #include "get.h"
98 #include "glthread.h"
99 #include "glapioffsets.h"
100 #include "histogram.h"
101 #include "hint.h"
102 #include "hash.h"
103 #include "light.h"
104 #include "lines.h"
105 #include "macros.h"
106 #include "matrix.h"
107 #include "occlude.h"
108 #include "pixel.h"
109 #include "points.h"
110 #include "polygon.h"
111 #if FEATURE_NV_vertex_program || FEATURE_NV_fragment_program
112 #include "program.h"
113 #endif
114 #include "rastpos.h"
115 #include "simple_list.h"
116 #include "state.h"
117 #include "stencil.h"
118 #include "texcompress.h"
119 #include "teximage.h"
120 #include "texobj.h"
121 #include "texstate.h"
122 #include "mtypes.h"
123 #include "varray.h"
124 #include "vtxfmt.h"
125 #if _HAVE_FULL_GL
126 #include "math/m_translate.h"
127 #include "math/m_matrix.h"
128 #include "math/m_xform.h"
129 #include "math/mathmod.h"
130 #endif
131 #include "shaderobjects.h"
132
133 #ifdef USE_SPARC_ASM
134 #include "sparc/sparc.h"
135 #endif
136
137 #ifndef MESA_VERBOSE
138 int MESA_VERBOSE = 0;
139 #endif
140
141 #ifndef MESA_DEBUG_FLAGS
142 int MESA_DEBUG_FLAGS = 0;
143 #endif
144
145
146 /* ubyte -> float conversion */
147 GLfloat _mesa_ubyte_to_float_color_tab[256];
148
149 static void
150 free_shared_state( GLcontext *ctx, struct gl_shared_state *ss );
151
152
153 /**********************************************************************/
154 /** \name OpenGL SI-style interface (new in Mesa 3.5)
155 *
156 * \if subset
157 * \note Most of these functions are never called in the Mesa subset.
158 * \endif
159 */
160 /*@{*/
161
162 /**
163 * Destroy context callback.
164 *
165 * \param gc context.
166 * \return GL_TRUE on success, or GL_FALSE on failure.
167 *
168 * \ifnot subset
169 * Called by window system/device driver (via __GLexports::destroyCurrent) when
170 * the rendering context is to be destroyed.
171 * \endif
172 *
173 * Frees the context data and the context structure.
174 */
175 GLboolean
176 _mesa_destroyContext(__GLcontext *gc)
177 {
178 if (gc) {
179 _mesa_free_context_data(gc);
180 _mesa_free(gc);
181 }
182 return GL_TRUE;
183 }
184
185 /**
186 * Unbind context callback.
187 *
188 * \param gc context.
189 * \return GL_TRUE on success, or GL_FALSE on failure.
190 *
191 * \ifnot subset
192 * Called by window system/device driver (via __GLexports::loseCurrent)
193 * when the rendering context is made non-current.
194 * \endif
195 *
196 * No-op
197 */
198 GLboolean
199 _mesa_loseCurrent(__GLcontext *gc)
200 {
201 /* XXX unbind context from thread */
202 (void) gc;
203 return GL_TRUE;
204 }
205
206 /**
207 * Bind context callback.
208 *
209 * \param gc context.
210 * \return GL_TRUE on success, or GL_FALSE on failure.
211 *
212 * \ifnot subset
213 * Called by window system/device driver (via __GLexports::makeCurrent)
214 * when the rendering context is made current.
215 * \endif
216 *
217 * No-op
218 */
219 GLboolean
220 _mesa_makeCurrent(__GLcontext *gc)
221 {
222 /* XXX bind context to thread */
223 (void) gc;
224 return GL_TRUE;
225 }
226
227 /**
228 * Share context callback.
229 *
230 * \param gc context.
231 * \param gcShare shared context.
232 * \return GL_TRUE on success, or GL_FALSE on failure.
233 *
234 * \ifnot subset
235 * Called by window system/device driver (via __GLexports::shareContext)
236 * \endif
237 *
238 * Update the shared context reference count, gl_shared_state::RefCount.
239 */
240 GLboolean
241 _mesa_shareContext(__GLcontext *gc, __GLcontext *gcShare)
242 {
243 if (gc && gcShare && gc->Shared && gcShare->Shared) {
244 gc->Shared->RefCount--;
245 if (gc->Shared->RefCount == 0) {
246 free_shared_state(gc, gc->Shared);
247 }
248 gc->Shared = gcShare->Shared;
249 gc->Shared->RefCount++;
250 return GL_TRUE;
251 }
252 else {
253 return GL_FALSE;
254 }
255 }
256
257
258 #if _HAVE_FULL_GL
259 /**
260 * Copy context callback.
261 */
262 GLboolean
263 _mesa_copyContext(__GLcontext *dst, const __GLcontext *src, GLuint mask)
264 {
265 if (dst && src) {
266 _mesa_copy_context( src, dst, mask );
267 return GL_TRUE;
268 }
269 else {
270 return GL_FALSE;
271 }
272 }
273 #endif
274
275 /** No-op */
276 GLboolean
277 _mesa_forceCurrent(__GLcontext *gc)
278 {
279 (void) gc;
280 return GL_TRUE;
281 }
282
283 /**
284 * Windows/buffer resizing notification callback.
285 *
286 * \param gc GL context.
287 * \return GL_TRUE on success, or GL_FALSE on failure.
288 */
289 GLboolean
290 _mesa_notifyResize(__GLcontext *gc)
291 {
292 GLint x, y;
293 GLuint width, height;
294 __GLdrawablePrivate *d = gc->imports.getDrawablePrivate(gc);
295 if (!d || !d->getDrawableSize)
296 return GL_FALSE;
297 d->getDrawableSize( d, &x, &y, &width, &height );
298 /* update viewport, resize software buffers, etc. */
299 return GL_TRUE;
300 }
301
302 /**
303 * Window/buffer destruction notification callback.
304 *
305 * \param gc GL context.
306 *
307 * Called when the context's window/buffer is going to be destroyed.
308 *
309 * No-op
310 */
311 void
312 _mesa_notifyDestroy(__GLcontext *gc)
313 {
314 /* Unbind from it. */
315 (void) gc;
316 }
317
318 /**
319 * Swap buffers notification callback.
320 *
321 * \param gc GL context.
322 *
323 * Called by window system just before swapping buffers.
324 * We have to finish any pending rendering.
325 */
326 void
327 _mesa_notifySwapBuffers(__GLcontext *gc)
328 {
329 FLUSH_VERTICES( gc, 0 );
330 }
331
332 /** No-op */
333 struct __GLdispatchStateRec *
334 _mesa_dispatchExec(__GLcontext *gc)
335 {
336 (void) gc;
337 return NULL;
338 }
339
340 /** No-op */
341 void
342 _mesa_beginDispatchOverride(__GLcontext *gc)
343 {
344 (void) gc;
345 }
346
347 /** No-op */
348 void
349 _mesa_endDispatchOverride(__GLcontext *gc)
350 {
351 (void) gc;
352 }
353
354 /**
355 * \ifnot subset
356 * Setup the exports.
357 *
358 * The window system will call these functions when it needs Mesa to do
359 * something.
360 *
361 * \note Device drivers should override these functions! For example,
362 * the Xlib driver should plug in the XMesa*-style functions into this
363 * structure. The XMesa-style functions should then call the _mesa_*
364 * version of these functions. This is an approximation to OO design
365 * (inheritance and virtual functions).
366 * \endif
367 *
368 * \if subset
369 * No-op.
370 *
371 * \endif
372 */
373 static void
374 _mesa_init_default_exports(__GLexports *exports)
375 {
376 #if _HAVE_FULL_GL
377 exports->destroyContext = _mesa_destroyContext;
378 exports->loseCurrent = _mesa_loseCurrent;
379 exports->makeCurrent = _mesa_makeCurrent;
380 exports->shareContext = _mesa_shareContext;
381 exports->copyContext = _mesa_copyContext;
382 exports->forceCurrent = _mesa_forceCurrent;
383 exports->notifyResize = _mesa_notifyResize;
384 exports->notifyDestroy = _mesa_notifyDestroy;
385 exports->notifySwapBuffers = _mesa_notifySwapBuffers;
386 exports->dispatchExec = _mesa_dispatchExec;
387 exports->beginDispatchOverride = _mesa_beginDispatchOverride;
388 exports->endDispatchOverride = _mesa_endDispatchOverride;
389 #else
390 (void) exports;
391 #endif
392 }
393
394 /**
395 * Exported OpenGL SI interface.
396 */
397 __GLcontext *
398 __glCoreCreateContext(__GLimports *imports, __GLcontextModes *modes)
399 {
400 GLcontext *ctx;
401
402 ctx = (GLcontext *) (*imports->calloc)(NULL, 1, sizeof(GLcontext));
403 if (ctx == NULL) {
404 return NULL;
405 }
406
407 /* XXX doesn't work at this time */
408 _mesa_initialize_context(ctx, modes, NULL, NULL, NULL);
409 ctx->imports = *imports;
410
411 return ctx;
412 }
413
414 /**
415 * Exported OpenGL SI interface.
416 */
417 void
418 __glCoreNopDispatch(void)
419 {
420 #if 0
421 /* SI */
422 __gl_dispatch = __glNopDispatchState;
423 #else
424 /* Mesa */
425 _glapi_set_dispatch(NULL);
426 #endif
427 }
428
429 /*@}*/
430
431
432 /**********************************************************************/
433 /** \name GL Visual allocation/destruction */
434 /**********************************************************************/
435 /*@{*/
436
437 /**
438 * Allocates a GLvisual structure and initializes it via
439 * _mesa_initialize_visual().
440 *
441 * \param rgbFlag GL_TRUE for RGB(A) mode, GL_FALSE for Color Index mode.
442 * \param dbFlag double buffering
443 * \param stereoFlag stereo buffer
444 * \param depthBits requested bits per depth buffer value. Any value in [0, 32]
445 * is acceptable but the actual depth type will be GLushort or GLuint as
446 * needed.
447 * \param stencilBits requested minimum bits per stencil buffer value
448 * \param accumRedBits, accumGreenBits, accumBlueBits, accumAlphaBits number of bits per color component in accum buffer.
449 * \param indexBits number of bits per pixel if \p rgbFlag is GL_FALSE
450 * \param redBits number of bits per color component in frame buffer for RGB(A)
451 * mode. We always use 8 in core Mesa though.
452 * \param greenBits same as above.
453 * \param blueBits same as above.
454 * \param alphaBits same as above.
455 * \param numSamples not really used.
456 *
457 * \return pointer to new GLvisual or NULL if requested parameters can't be
458 * met.
459 *
460 * \note Need to add params for level and numAuxBuffers (at least)
461 */
462 GLvisual *
463 _mesa_create_visual( GLboolean rgbFlag,
464 GLboolean dbFlag,
465 GLboolean stereoFlag,
466 GLint redBits,
467 GLint greenBits,
468 GLint blueBits,
469 GLint alphaBits,
470 GLint indexBits,
471 GLint depthBits,
472 GLint stencilBits,
473 GLint accumRedBits,
474 GLint accumGreenBits,
475 GLint accumBlueBits,
476 GLint accumAlphaBits,
477 GLint numSamples )
478 {
479 GLvisual *vis = (GLvisual *) CALLOC( sizeof(GLvisual) );
480 if (vis) {
481 if (!_mesa_initialize_visual(vis, rgbFlag, dbFlag, stereoFlag,
482 redBits, greenBits, blueBits, alphaBits,
483 indexBits, depthBits, stencilBits,
484 accumRedBits, accumGreenBits,
485 accumBlueBits, accumAlphaBits,
486 numSamples)) {
487 FREE(vis);
488 return NULL;
489 }
490 }
491 return vis;
492 }
493
494 /**
495 * Makes some sanity checks and fills in the fields of the
496 * GLvisual object with the given parameters. If the caller needs
497 * to set additional fields, he should just probably init the whole GLvisual
498 * object himself.
499 * \return GL_TRUE on success, or GL_FALSE on failure.
500 *
501 * \sa _mesa_create_visual() above for the parameter description.
502 */
503 GLboolean
504 _mesa_initialize_visual( GLvisual *vis,
505 GLboolean rgbFlag,
506 GLboolean dbFlag,
507 GLboolean stereoFlag,
508 GLint redBits,
509 GLint greenBits,
510 GLint blueBits,
511 GLint alphaBits,
512 GLint indexBits,
513 GLint depthBits,
514 GLint stencilBits,
515 GLint accumRedBits,
516 GLint accumGreenBits,
517 GLint accumBlueBits,
518 GLint accumAlphaBits,
519 GLint numSamples )
520 {
521 assert(vis);
522
523 if (depthBits < 0 || depthBits > 32) {
524 return GL_FALSE;
525 }
526 if (stencilBits < 0 || stencilBits > STENCIL_BITS) {
527 return GL_FALSE;
528 }
529 if (accumRedBits < 0 || accumRedBits > ACCUM_BITS) {
530 return GL_FALSE;
531 }
532 if (accumGreenBits < 0 || accumGreenBits > ACCUM_BITS) {
533 return GL_FALSE;
534 }
535 if (accumBlueBits < 0 || accumBlueBits > ACCUM_BITS) {
536 return GL_FALSE;
537 }
538 if (accumAlphaBits < 0 || accumAlphaBits > ACCUM_BITS) {
539 return GL_FALSE;
540 }
541
542 vis->rgbMode = rgbFlag;
543 vis->doubleBufferMode = dbFlag;
544 vis->stereoMode = stereoFlag;
545
546 vis->redBits = redBits;
547 vis->greenBits = greenBits;
548 vis->blueBits = blueBits;
549 vis->alphaBits = alphaBits;
550 vis->rgbBits = redBits + greenBits + blueBits;
551
552 vis->indexBits = indexBits;
553 vis->depthBits = depthBits;
554 vis->stencilBits = stencilBits;
555
556 vis->accumRedBits = accumRedBits;
557 vis->accumGreenBits = accumGreenBits;
558 vis->accumBlueBits = accumBlueBits;
559 vis->accumAlphaBits = accumAlphaBits;
560
561 vis->haveAccumBuffer = accumRedBits > 0;
562 vis->haveDepthBuffer = depthBits > 0;
563 vis->haveStencilBuffer = stencilBits > 0;
564
565 vis->numAuxBuffers = 0;
566 vis->level = 0;
567 vis->pixmapMode = 0;
568 vis->sampleBuffers = numSamples > 0 ? 1 : 0;
569 vis->samples = numSamples;
570
571 return GL_TRUE;
572 }
573
574
575 /**
576 * Destroy a visual and free its memory.
577 *
578 * \param vis visual.
579 *
580 * Frees the visual structure.
581 */
582 void
583 _mesa_destroy_visual( GLvisual *vis )
584 {
585 FREE(vis);
586 }
587
588 /*@}*/
589
590
591 /**********************************************************************/
592 /** \name Context allocation, initialization, destroying
593 *
594 * The purpose of the most initialization functions here is to provide the
595 * default state values according to the OpenGL specification.
596 */
597 /**********************************************************************/
598 /*@{*/
599
600 /**
601 * One-time initialization mutex lock.
602 *
603 * \sa Used by one_time_init().
604 */
605 _glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
606
607 /**
608 * Calls all the various one-time-init functions in Mesa.
609 *
610 * While holding a global mutex lock, calls several initialization functions,
611 * and sets the glapi callbacks if the \c MESA_DEBUG environment variable is
612 * defined.
613 *
614 * \sa _mesa_init_lists(), _math_init().
615 */
616 static void
617 one_time_init( GLcontext *ctx )
618 {
619 static GLboolean alreadyCalled = GL_FALSE;
620 (void) ctx;
621 _glthread_LOCK_MUTEX(OneTimeLock);
622 if (!alreadyCalled) {
623 GLuint i;
624
625 /* do some implementation tests */
626 assert( sizeof(GLbyte) == 1 );
627 assert( sizeof(GLubyte) == 1 );
628 assert( sizeof(GLshort) == 2 );
629 assert( sizeof(GLushort) == 2 );
630 assert( sizeof(GLint) == 4 );
631 assert( sizeof(GLuint) == 4 );
632
633 _mesa_init_lists();
634
635 #if _HAVE_FULL_GL
636 _math_init();
637
638 for (i = 0; i < 256; i++) {
639 _mesa_ubyte_to_float_color_tab[i] = (float) i / 255.0F;
640 }
641 #endif
642
643 #ifdef USE_SPARC_ASM
644 _mesa_init_sparc_glapi_relocs();
645 #endif
646 if (_mesa_getenv("MESA_DEBUG")) {
647 _glapi_noop_enable_warnings(GL_TRUE);
648 #ifndef GLX_DIRECT_RENDERING
649 /* libGL from before 2002/06/28 don't have this function. Someday,
650 * when newer libGL libs are common, remove the #ifdef test. This
651 * only serves to print warnings when calling undefined GL functions.
652 */
653 _glapi_set_warning_func( (_glapi_warning_func) _mesa_warning );
654 #endif
655 }
656 else {
657 _glapi_noop_enable_warnings(GL_FALSE);
658 }
659
660 #if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
661 _mesa_debug(ctx, "Mesa DEBUG build %s %s\n", __DATE__, __TIME__);
662 #endif
663
664 alreadyCalled = GL_TRUE;
665 }
666 _glthread_UNLOCK_MUTEX(OneTimeLock);
667 }
668
669
670 /**
671 * Allocate and initialize a shared context state structure.
672 * Initializes the display list, texture objects and vertex programs hash
673 * tables, allocates the texture objects. If it runs out of memory, frees
674 * everything already allocated before returning NULL.
675 *
676 * \return pointer to a gl_shared_state structure on success, or NULL on
677 * failure.
678 */
679 static GLboolean
680 alloc_shared_state( GLcontext *ctx )
681 {
682 struct gl_shared_state *ss = CALLOC_STRUCT(gl_shared_state);
683 if (!ss)
684 return GL_FALSE;
685
686 ctx->Shared = ss;
687
688 _glthread_INIT_MUTEX(ss->Mutex);
689
690 ss->DisplayList = _mesa_NewHashTable();
691 ss->TexObjects = _mesa_NewHashTable();
692 #if FEATURE_NV_vertex_program || FEATURE_NV_fragment_program
693 ss->Programs = _mesa_NewHashTable();
694 #endif
695
696 #if FEATURE_ARB_vertex_program
697 ss->DefaultVertexProgram = ctx->Driver.NewProgram(ctx, GL_VERTEX_PROGRAM_ARB, 0);
698 if (!ss->DefaultVertexProgram)
699 goto cleanup;
700 #endif
701 #if FEATURE_ARB_fragment_program
702 ss->DefaultFragmentProgram = ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, 0);
703 if (!ss->DefaultFragmentProgram)
704 goto cleanup;
705 #endif
706 #if FEATURE_ATI_fragment_shader
707 ss->DefaultFragmentShader = ctx->Driver.NewProgram(ctx, GL_FRAGMENT_SHADER_ATI, 0);
708 if (!ss->DefaultFragmentShader)
709 goto cleanup;
710 #endif
711
712 ss->BufferObjects = _mesa_NewHashTable();
713
714 ss->GL2Objects = _mesa_NewHashTable ();
715
716 ss->Default1D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_1D);
717 if (!ss->Default1D)
718 goto cleanup;
719
720 ss->Default2D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_2D);
721 if (!ss->Default2D)
722 goto cleanup;
723
724 ss->Default3D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_3D);
725 if (!ss->Default3D)
726 goto cleanup;
727
728 ss->DefaultCubeMap = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_CUBE_MAP_ARB);
729 if (!ss->DefaultCubeMap)
730 goto cleanup;
731
732 ss->DefaultRect = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_RECTANGLE_NV);
733 if (!ss->DefaultRect)
734 goto cleanup;
735
736 /* Effectively bind the default textures to all texture units */
737 ss->Default1D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
738 ss->Default2D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
739 ss->Default3D->RefCount += MAX_TEXTURE_IMAGE_UNITS;
740 ss->DefaultCubeMap->RefCount += MAX_TEXTURE_IMAGE_UNITS;
741 ss->DefaultRect->RefCount += MAX_TEXTURE_IMAGE_UNITS;
742
743 #if FEATURE_EXT_framebuffer_object
744 ss->FrameBuffers = _mesa_NewHashTable();
745 if (!ss->FrameBuffers)
746 goto cleanup;
747 ss->RenderBuffers = _mesa_NewHashTable();
748 if (!ss->RenderBuffers)
749 goto cleanup;
750 #endif
751
752
753 return GL_TRUE;
754
755 cleanup:
756 /* Ran out of memory at some point. Free everything and return NULL */
757 if (ss->DisplayList)
758 _mesa_DeleteHashTable(ss->DisplayList);
759 if (ss->TexObjects)
760 _mesa_DeleteHashTable(ss->TexObjects);
761 #if FEATURE_NV_vertex_program
762 if (ss->Programs)
763 _mesa_DeleteHashTable(ss->Programs);
764 #endif
765 #if FEATURE_ARB_vertex_program
766 if (ss->DefaultVertexProgram)
767 ctx->Driver.DeleteProgram(ctx, ss->DefaultVertexProgram);
768 #endif
769 #if FEATURE_ARB_fragment_program
770 if (ss->DefaultFragmentProgram)
771 ctx->Driver.DeleteProgram(ctx, ss->DefaultFragmentProgram);
772 #endif
773 #if FEATURE_ATI_fragment_shader
774 if (ss->DefaultFragmentShader)
775 ctx->Driver.DeleteProgram(ctx, ss->DefaultFragmentShader);
776 #endif
777 #if FEATURE_ARB_vertex_buffer_object
778 if (ss->BufferObjects)
779 _mesa_DeleteHashTable(ss->BufferObjects);
780 #endif
781
782 if (ss->GL2Objects)
783 _mesa_DeleteHashTable (ss->GL2Objects);
784
785 #if FEATURE_EXT_framebuffer_object
786 if (ss->FrameBuffers)
787 _mesa_DeleteHashTable(ss->FrameBuffers);
788 if (ss->RenderBuffers)
789 _mesa_DeleteHashTable(ss->RenderBuffers);
790 #endif
791
792 if (ss->Default1D)
793 (*ctx->Driver.DeleteTexture)(ctx, ss->Default1D);
794 if (ss->Default2D)
795 (*ctx->Driver.DeleteTexture)(ctx, ss->Default2D);
796 if (ss->Default3D)
797 (*ctx->Driver.DeleteTexture)(ctx, ss->Default3D);
798 if (ss->DefaultCubeMap)
799 (*ctx->Driver.DeleteTexture)(ctx, ss->DefaultCubeMap);
800 if (ss->DefaultRect)
801 (*ctx->Driver.DeleteTexture)(ctx, ss->DefaultRect);
802 if (ss)
803 _mesa_free(ss);
804 return GL_FALSE;
805 }
806
807 /**
808 * Deallocate a shared state context and all children structures.
809 *
810 * \param ctx GL context.
811 * \param ss shared state pointer.
812 *
813 * Frees the display lists, the texture objects (calling the driver texture
814 * deletion callback to free its private data) and the vertex programs, as well
815 * as their hash tables.
816 *
817 * \sa alloc_shared_state().
818 */
819 static void
820 free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
821 {
822 /* Free display lists */
823 while (1) {
824 GLuint list = _mesa_HashFirstEntry(ss->DisplayList);
825 if (list) {
826 _mesa_destroy_list(ctx, list);
827 }
828 else {
829 break;
830 }
831 }
832 _mesa_DeleteHashTable(ss->DisplayList);
833
834 /* Free texture objects */
835 ASSERT(ctx->Driver.DeleteTexture);
836 /* the default textures */
837 (*ctx->Driver.DeleteTexture)(ctx, ss->Default1D);
838 (*ctx->Driver.DeleteTexture)(ctx, ss->Default2D);
839 (*ctx->Driver.DeleteTexture)(ctx, ss->Default3D);
840 (*ctx->Driver.DeleteTexture)(ctx, ss->DefaultCubeMap);
841 (*ctx->Driver.DeleteTexture)(ctx, ss->DefaultRect);
842 /* all other textures */
843 while (1) {
844 GLuint texName = _mesa_HashFirstEntry(ss->TexObjects);
845 if (texName) {
846 struct gl_texture_object *texObj = (struct gl_texture_object *)
847 _mesa_HashLookup(ss->TexObjects, texName);
848 ASSERT(texObj);
849 (*ctx->Driver.DeleteTexture)(ctx, texObj);
850 _mesa_HashRemove(ss->TexObjects, texName);
851 }
852 else {
853 break;
854 }
855 }
856 _mesa_DeleteHashTable(ss->TexObjects);
857
858 #if FEATURE_NV_vertex_program
859 /* Free vertex programs */
860 while (1) {
861 GLuint prog = _mesa_HashFirstEntry(ss->Programs);
862 if (prog) {
863 struct program *p = (struct program *) _mesa_HashLookup(ss->Programs,
864 prog);
865 ASSERT(p);
866 ctx->Driver.DeleteProgram(ctx, p);
867 _mesa_HashRemove(ss->Programs, prog);
868 }
869 else {
870 break;
871 }
872 }
873 _mesa_DeleteHashTable(ss->Programs);
874 #endif
875 #if FEATURE_ARB_vertex_program
876 _mesa_delete_program(ctx, ss->DefaultVertexProgram);
877 #endif
878 #if FEATURE_ARB_fragment_program
879 _mesa_delete_program(ctx, ss->DefaultFragmentProgram);
880 #endif
881 #if FEATURE_ATI_fragment_shader
882 _mesa_delete_program(ctx, ss->DefaultFragmentShader);
883 #endif
884
885 #if FEATURE_ARB_vertex_buffer_object
886 _mesa_DeleteHashTable(ss->BufferObjects);
887 #endif
888
889 _mesa_DeleteHashTable (ss->GL2Objects);
890
891 #if FEATURE_EXT_framebuffer_object
892 _mesa_DeleteHashTable(ss->FrameBuffers);
893 _mesa_DeleteHashTable(ss->RenderBuffers);
894 #endif
895
896 _glthread_DESTROY_MUTEX(ss->Mutex);
897
898 FREE(ss);
899 }
900
901
902 /**
903 * Initialize fields of gl_current_attrib (aka ctx->Current.*)
904 */
905 static void
906 _mesa_init_current( GLcontext *ctx )
907 {
908 GLuint i;
909
910 /* Current group */
911 for (i = 0; i < VERT_ATTRIB_MAX; i++) {
912 ASSIGN_4V( ctx->Current.Attrib[i], 0.0, 0.0, 0.0, 1.0 );
913 }
914 /* special cases: */
915 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_WEIGHT], 1.0, 0.0, 0.0, 1.0 );
916 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 1.0 );
917 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 );
918 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR1], 0.0, 0.0, 0.0, 1.0 );
919 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_FOG], 0.0, 0.0, 0.0, 0.0 );
920
921 ctx->Current.Index = 1;
922 ctx->Current.EdgeFlag = GL_TRUE;
923 }
924
925
926 /**
927 * Initialize fields of gl_constants (aka ctx->Const.*).
928 * Use defaults from config.h. The device drivers will often override
929 * some of these values (such as number of texture units).
930 */
931 static void
932 _mesa_init_constants( GLcontext *ctx )
933 {
934 assert(ctx);
935
936 assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);
937 assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);
938
939 /* Constants, may be overriden (usually only reduced) by device drivers */
940 ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
941 ctx->Const.Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS;
942 ctx->Const.MaxCubeTextureLevels = MAX_CUBE_TEXTURE_LEVELS;
943 ctx->Const.MaxTextureRectSize = MAX_TEXTURE_RECT_SIZE;
944 ctx->Const.MaxTextureUnits = MAX_TEXTURE_UNITS;
945 ctx->Const.MaxTextureCoordUnits = MAX_TEXTURE_COORD_UNITS;
946 ctx->Const.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
947 ctx->Const.MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY;
948 ctx->Const.MaxTextureLodBias = MAX_TEXTURE_LOD_BIAS;
949 ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
950 ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
951 ctx->Const.MinPointSize = MIN_POINT_SIZE;
952 ctx->Const.MaxPointSize = MAX_POINT_SIZE;
953 ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
954 ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
955 ctx->Const.PointSizeGranularity = (GLfloat) POINT_SIZE_GRANULARITY;
956 ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
957 ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
958 ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
959 ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
960 ctx->Const.LineWidthGranularity = (GLfloat) LINE_WIDTH_GRANULARITY;
961 ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
962 ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
963 ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
964 ctx->Const.MaxClipPlanes = MAX_CLIP_PLANES;
965 ctx->Const.MaxLights = MAX_LIGHTS;
966 ctx->Const.MaxShininess = 128.0;
967 ctx->Const.MaxSpotExponent = 128.0;
968 ctx->Const.MaxViewportWidth = MAX_WIDTH;
969 ctx->Const.MaxViewportHeight = MAX_HEIGHT;
970 #if FEATURE_ARB_vertex_program
971 ctx->Const.MaxVertexProgramInstructions = MAX_NV_VERTEX_PROGRAM_INSTRUCTIONS;
972 ctx->Const.MaxVertexProgramAttribs = MAX_NV_VERTEX_PROGRAM_INPUTS;
973 ctx->Const.MaxVertexProgramTemps = MAX_NV_VERTEX_PROGRAM_TEMPS;
974 ctx->Const.MaxVertexProgramLocalParams = MAX_NV_VERTEX_PROGRAM_PARAMS;
975 ctx->Const.MaxVertexProgramEnvParams = MAX_NV_VERTEX_PROGRAM_PARAMS;/*XXX*/
976 ctx->Const.MaxVertexProgramAddressRegs = MAX_VERTEX_PROGRAM_ADDRESS_REGS;
977 #endif
978 #if FEATURE_ARB_fragment_program
979 ctx->Const.MaxFragmentProgramInstructions = MAX_NV_FRAGMENT_PROGRAM_INSTRUCTIONS;
980 ctx->Const.MaxFragmentProgramAttribs = MAX_NV_FRAGMENT_PROGRAM_INPUTS;
981 ctx->Const.MaxFragmentProgramTemps = MAX_NV_FRAGMENT_PROGRAM_TEMPS;
982 ctx->Const.MaxFragmentProgramLocalParams = MAX_NV_FRAGMENT_PROGRAM_PARAMS;
983 ctx->Const.MaxFragmentProgramEnvParams = MAX_NV_FRAGMENT_PROGRAM_PARAMS;/*XXX*/
984 ctx->Const.MaxFragmentProgramAddressRegs = MAX_FRAGMENT_PROGRAM_ADDRESS_REGS;
985 ctx->Const.MaxFragmentProgramAluInstructions = MAX_FRAGMENT_PROGRAM_ALU_INSTRUCTIONS;
986 ctx->Const.MaxFragmentProgramTexInstructions = MAX_FRAGMENT_PROGRAM_TEX_INSTRUCTIONS;
987 ctx->Const.MaxFragmentProgramTexIndirections = MAX_FRAGMENT_PROGRAM_TEX_INDIRECTIONS;
988 #endif
989
990 ctx->Const.MaxProgramMatrices = MAX_PROGRAM_MATRICES;
991 ctx->Const.MaxProgramMatrixStackDepth = MAX_PROGRAM_MATRIX_STACK_DEPTH;
992
993 /* If we're running in the X server, do bounds checking to prevent
994 * segfaults and server crashes!
995 */
996 #if defined(XFree86LOADER) && defined(IN_MODULE)
997 ctx->Const.CheckArrayBounds = GL_TRUE;
998 #else
999 ctx->Const.CheckArrayBounds = GL_FALSE;
1000 #endif
1001
1002 ctx->Const.MaxDrawBuffers = MAX_DRAW_BUFFERS;
1003
1004 /* GL_OES_read_format */
1005 ctx->Const.ColorReadFormat = GL_RGBA;
1006 ctx->Const.ColorReadType = GL_UNSIGNED_BYTE;
1007
1008 #if FEATURE_EXT_framebuffer_object
1009 ctx->Const.MaxColorAttachments = MAX_COLOR_ATTACHMENTS;
1010 ctx->Const.MaxRenderbufferSize = MAX_WIDTH;
1011 #endif
1012
1013 /* sanity checks */
1014 ASSERT(ctx->Const.MaxTextureUnits == MAX2(ctx->Const.MaxTextureImageUnits, ctx->Const.MaxTextureCoordUnits));
1015 }
1016
1017
1018 /**
1019 * Initialize the attribute groups in a GL context.
1020 *
1021 * \param ctx GL context.
1022 *
1023 * Initializes all the attributes, calling the respective <tt>init*</tt>
1024 * functions for the more complex data structures.
1025 */
1026 static GLboolean
1027 init_attrib_groups( GLcontext *ctx )
1028 {
1029 assert(ctx);
1030
1031 /* Constants */
1032 _mesa_init_constants( ctx );
1033
1034 /* Extensions */
1035 _mesa_init_extensions( ctx );
1036
1037 /* Attribute Groups */
1038 _mesa_init_accum( ctx );
1039 _mesa_init_attrib( ctx );
1040 _mesa_init_buffer_objects( ctx );
1041 _mesa_init_color( ctx );
1042 _mesa_init_colortables( ctx );
1043 _mesa_init_current( ctx );
1044 _mesa_init_depth( ctx );
1045 _mesa_init_debug( ctx );
1046 _mesa_init_display_list( ctx );
1047 _mesa_init_eval( ctx );
1048 _mesa_init_feedback( ctx );
1049 _mesa_init_fog( ctx );
1050 _mesa_init_histogram( ctx );
1051 _mesa_init_hint( ctx );
1052 _mesa_init_line( ctx );
1053 _mesa_init_lighting( ctx );
1054 _mesa_init_matrix( ctx );
1055 _mesa_init_multisample( ctx );
1056 _mesa_init_occlude( ctx );
1057 _mesa_init_pixel( ctx );
1058 _mesa_init_point( ctx );
1059 _mesa_init_polygon( ctx );
1060 _mesa_init_program( ctx );
1061 _mesa_init_rastpos( ctx );
1062 _mesa_init_scissor( ctx );
1063 _mesa_init_shaderobjects (ctx);
1064 _mesa_init_stencil( ctx );
1065 _mesa_init_transform( ctx );
1066 _mesa_init_varray( ctx );
1067 _mesa_init_viewport( ctx );
1068
1069 if (!_mesa_init_texture( ctx ))
1070 return GL_FALSE;
1071
1072 _mesa_init_texture_s3tc( ctx );
1073 _mesa_init_texture_fxt1( ctx );
1074
1075 /* Miscellaneous */
1076 ctx->NewState = _NEW_ALL;
1077 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
1078 ctx->_Facing = 0;
1079 #if CHAN_TYPE == GL_FLOAT
1080 ctx->ClampFragmentColors = GL_FALSE; /* XXX temporary */
1081 #else
1082 ctx->ClampFragmentColors = GL_TRUE;
1083 #endif
1084 ctx->ClampVertexColors = GL_TRUE;
1085
1086 return GL_TRUE;
1087 }
1088
1089
1090 /**
1091 * This is the default function we plug into all dispatch table slots
1092 * This helps prevents a segfault when someone calls a GL function without
1093 * first checking if the extension's supported.
1094 */
1095 static int
1096 generic_nop(void)
1097 {
1098 _mesa_problem(NULL, "User called no-op dispatch function (an unsupported extension function?)");
1099 return 0;
1100 }
1101
1102
1103 /**
1104 * Allocate and initialize a new dispatch table.
1105 */
1106 static struct _glapi_table *
1107 alloc_dispatch_table(void)
1108 {
1109 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
1110 * In practice, this'll be the same for stand-alone Mesa. But for DRI
1111 * Mesa we do this to accomodate different versions of libGL and various
1112 * DRI drivers.
1113 */
1114 GLint numEntries = MAX2(_glapi_get_dispatch_table_size(),
1115 sizeof(struct _glapi_table) / sizeof(_glapi_proc));
1116 struct _glapi_table *table =
1117 (struct _glapi_table *) _mesa_malloc(numEntries * sizeof(_glapi_proc));
1118 if (table) {
1119 _glapi_proc *entry = (_glapi_proc *) table;
1120 GLint i;
1121 for (i = 0; i < numEntries; i++) {
1122 entry[i] = (_glapi_proc) generic_nop;
1123 }
1124 }
1125 return table;
1126 }
1127
1128
1129 /**
1130 * Initialize a GLcontext struct (rendering context).
1131 *
1132 * This includes allocating all the other structs and arrays which hang off of
1133 * the context by pointers.
1134 * Note that the driver needs to pass in its dd_function_table here since
1135 * we need to at least call driverFunctions->NewTextureObject to create the
1136 * default texture objects.
1137 *
1138 * Called by _mesa_create_context().
1139 *
1140 * Performs the imports and exports callback tables initialization, and
1141 * miscellaneous one-time initializations. If no shared context is supplied one
1142 * is allocated, and increase its reference count. Setups the GL API dispatch
1143 * tables. Initialize the TNL module. Sets the maximum Z buffer depth.
1144 * Finally queries the \c MESA_DEBUG and \c MESA_VERBOSE environment variables
1145 * for debug flags.
1146 *
1147 * \param ctx the context to initialize
1148 * \param visual describes the visual attributes for this context
1149 * \param share_list points to context to share textures, display lists,
1150 * etc with, or NULL
1151 * \param driverFunctions table of device driver functions for this context
1152 * to use
1153 * \param driverContext pointer to driver-specific context data
1154 */
1155 GLboolean
1156 _mesa_initialize_context( GLcontext *ctx,
1157 const GLvisual *visual,
1158 GLcontext *share_list,
1159 const struct dd_function_table *driverFunctions,
1160 void *driverContext )
1161 {
1162 ASSERT(driverContext);
1163 assert(driverFunctions->NewTextureObject);
1164 assert(driverFunctions->FreeTexImageData);
1165
1166 /* If the driver wants core Mesa to use special imports, it'll have to
1167 * override these defaults.
1168 */
1169 _mesa_init_default_imports( &(ctx->imports), driverContext );
1170
1171 /* initialize the exports (Mesa functions called by the window system) */
1172 _mesa_init_default_exports( &(ctx->exports) );
1173
1174 /* misc one-time initializations */
1175 one_time_init(ctx);
1176
1177 ctx->Visual = *visual;
1178 ctx->DrawBuffer = NULL;
1179 ctx->ReadBuffer = NULL;
1180 ctx->WinSysDrawBuffer = NULL;
1181 ctx->WinSysReadBuffer = NULL;
1182
1183 /* Plug in driver functions and context pointer here.
1184 * This is important because when we call alloc_shared_state() below
1185 * we'll call ctx->Driver.NewTextureObject() to create the default
1186 * textures.
1187 */
1188 ctx->Driver = *driverFunctions;
1189 ctx->DriverCtx = driverContext;
1190
1191 if (share_list) {
1192 /* share state with another context */
1193 ctx->Shared = share_list->Shared;
1194 }
1195 else {
1196 /* allocate new, unshared state */
1197 if (!alloc_shared_state( ctx )) {
1198 return GL_FALSE;
1199 }
1200 }
1201 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
1202 ctx->Shared->RefCount++;
1203 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1204
1205 if (!init_attrib_groups( ctx )) {
1206 free_shared_state(ctx, ctx->Shared);
1207 return GL_FALSE;
1208 }
1209
1210 /* setup the API dispatch tables */
1211 ctx->Exec = alloc_dispatch_table();
1212 ctx->Save = alloc_dispatch_table();
1213 if (!ctx->Exec || !ctx->Save) {
1214 free_shared_state(ctx, ctx->Shared);
1215 if (ctx->Exec)
1216 _mesa_free(ctx->Exec);
1217 }
1218 _mesa_init_exec_table(ctx->Exec);
1219 ctx->CurrentDispatch = ctx->Exec;
1220 #if _HAVE_FULL_GL
1221 _mesa_init_dlist_table(ctx->Save);
1222 _mesa_install_save_vtxfmt( ctx, &ctx->ListState.ListVtxfmt );
1223 /* Neutral tnl module stuff */
1224 _mesa_init_exec_vtxfmt( ctx );
1225 ctx->TnlModule.Current = NULL;
1226 ctx->TnlModule.SwapCount = 0;
1227 #endif
1228
1229 ctx->_MaintainTexEnvProgram = (_mesa_getenv("MESA_TEX_PROG") != NULL);
1230 ctx->_MaintainTnlProgram = (_mesa_getenv("MESA_TNL_PROG") != NULL);
1231
1232 return GL_TRUE;
1233 }
1234
1235
1236 /**
1237 * Allocate and initialize a GLcontext structure.
1238 * Note that the driver needs to pass in its dd_function_table here since
1239 * we need to at least call driverFunctions->NewTextureObject to initialize
1240 * the rendering context.
1241 *
1242 * \param visual a GLvisual pointer (we copy the struct contents)
1243 * \param share_list another context to share display lists with or NULL
1244 * \param driverFunctions points to the dd_function_table into which the
1245 * driver has plugged in all its special functions.
1246 * \param driverCtx points to the device driver's private context state
1247 *
1248 * \return pointer to a new __GLcontextRec or NULL if error.
1249 */
1250 GLcontext *
1251 _mesa_create_context( const GLvisual *visual,
1252 GLcontext *share_list,
1253 const struct dd_function_table *driverFunctions,
1254 void *driverContext )
1255
1256 {
1257 GLcontext *ctx;
1258
1259 ASSERT(visual);
1260 ASSERT(driverContext);
1261
1262 ctx = (GLcontext *) _mesa_calloc(sizeof(GLcontext));
1263 if (!ctx)
1264 return NULL;
1265
1266 if (_mesa_initialize_context(ctx, visual, share_list,
1267 driverFunctions, driverContext)) {
1268 return ctx;
1269 }
1270 else {
1271 _mesa_free(ctx);
1272 return NULL;
1273 }
1274 }
1275
1276
1277 /**
1278 * Free the data associated with the given context.
1279 *
1280 * But doesn't free the GLcontext struct itself.
1281 *
1282 * \sa _mesa_initialize_context() and init_attrib_groups().
1283 */
1284 void
1285 _mesa_free_context_data( GLcontext *ctx )
1286 {
1287 /* if we're destroying the current context, unbind it first */
1288 if (ctx == _mesa_get_current_context()) {
1289 _mesa_make_current(NULL, NULL, NULL);
1290 }
1291
1292 _mesa_free_lighting_data( ctx );
1293 _mesa_free_eval_data( ctx );
1294 _mesa_free_texture_data( ctx );
1295 _mesa_free_matrix_data( ctx );
1296 _mesa_free_viewport_data( ctx );
1297 _mesa_free_colortables_data( ctx );
1298 _mesa_free_program_data(ctx);
1299 _mesa_free_occlude_data(ctx);
1300
1301 #if FEATURE_ARB_vertex_buffer_object
1302 _mesa_delete_buffer_object(ctx, ctx->Array.NullBufferObj);
1303 #endif
1304
1305 /* free dispatch tables */
1306 _mesa_free(ctx->Exec);
1307 _mesa_free(ctx->Save);
1308
1309 /* Shared context state (display lists, textures, etc) */
1310 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
1311 ctx->Shared->RefCount--;
1312 assert(ctx->Shared->RefCount >= 0);
1313 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1314 if (ctx->Shared->RefCount == 0) {
1315 /* free shared state */
1316 free_shared_state( ctx, ctx->Shared );
1317 }
1318
1319 if (ctx->Extensions.String)
1320 FREE((void *) ctx->Extensions.String);
1321 }
1322
1323
1324 /**
1325 * Destroy a GLcontext structure.
1326 *
1327 * \param ctx GL context.
1328 *
1329 * Calls _mesa_free_context_data() and frees the GLcontext structure itself.
1330 */
1331 void
1332 _mesa_destroy_context( GLcontext *ctx )
1333 {
1334 if (ctx) {
1335 _mesa_free_context_data(ctx);
1336 FREE( (void *) ctx );
1337 }
1338 }
1339
1340
1341 #if _HAVE_FULL_GL
1342 /**
1343 * Copy attribute groups from one context to another.
1344 *
1345 * \param src source context
1346 * \param dst destination context
1347 * \param mask bitwise OR of GL_*_BIT flags
1348 *
1349 * According to the bits specified in \p mask, copies the corresponding
1350 * attributes from \p src into \p dst. For many of the attributes a simple \c
1351 * memcpy is not enough due to the existence of internal pointers in their data
1352 * structures.
1353 */
1354 void
1355 _mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
1356 {
1357 if (mask & GL_ACCUM_BUFFER_BIT) {
1358 /* OK to memcpy */
1359 dst->Accum = src->Accum;
1360 }
1361 if (mask & GL_COLOR_BUFFER_BIT) {
1362 /* OK to memcpy */
1363 dst->Color = src->Color;
1364 }
1365 if (mask & GL_CURRENT_BIT) {
1366 /* OK to memcpy */
1367 dst->Current = src->Current;
1368 }
1369 if (mask & GL_DEPTH_BUFFER_BIT) {
1370 /* OK to memcpy */
1371 dst->Depth = src->Depth;
1372 }
1373 if (mask & GL_ENABLE_BIT) {
1374 /* no op */
1375 }
1376 if (mask & GL_EVAL_BIT) {
1377 /* OK to memcpy */
1378 dst->Eval = src->Eval;
1379 }
1380 if (mask & GL_FOG_BIT) {
1381 /* OK to memcpy */
1382 dst->Fog = src->Fog;
1383 }
1384 if (mask & GL_HINT_BIT) {
1385 /* OK to memcpy */
1386 dst->Hint = src->Hint;
1387 }
1388 if (mask & GL_LIGHTING_BIT) {
1389 GLuint i;
1390 /* begin with memcpy */
1391 MEMCPY( &dst->Light, &src->Light, sizeof(struct gl_light) );
1392 /* fixup linked lists to prevent pointer insanity */
1393 make_empty_list( &(dst->Light.EnabledList) );
1394 for (i = 0; i < MAX_LIGHTS; i++) {
1395 if (dst->Light.Light[i].Enabled) {
1396 insert_at_tail(&(dst->Light.EnabledList), &(dst->Light.Light[i]));
1397 }
1398 }
1399 }
1400 if (mask & GL_LINE_BIT) {
1401 /* OK to memcpy */
1402 dst->Line = src->Line;
1403 }
1404 if (mask & GL_LIST_BIT) {
1405 /* OK to memcpy */
1406 dst->List = src->List;
1407 }
1408 if (mask & GL_PIXEL_MODE_BIT) {
1409 /* OK to memcpy */
1410 dst->Pixel = src->Pixel;
1411 }
1412 if (mask & GL_POINT_BIT) {
1413 /* OK to memcpy */
1414 dst->Point = src->Point;
1415 }
1416 if (mask & GL_POLYGON_BIT) {
1417 /* OK to memcpy */
1418 dst->Polygon = src->Polygon;
1419 }
1420 if (mask & GL_POLYGON_STIPPLE_BIT) {
1421 /* Use loop instead of MEMCPY due to problem with Portland Group's
1422 * C compiler. Reported by John Stone.
1423 */
1424 GLuint i;
1425 for (i = 0; i < 32; i++) {
1426 dst->PolygonStipple[i] = src->PolygonStipple[i];
1427 }
1428 }
1429 if (mask & GL_SCISSOR_BIT) {
1430 /* OK to memcpy */
1431 dst->Scissor = src->Scissor;
1432 }
1433 if (mask & GL_STENCIL_BUFFER_BIT) {
1434 /* OK to memcpy */
1435 dst->Stencil = src->Stencil;
1436 }
1437 if (mask & GL_TEXTURE_BIT) {
1438 /* Cannot memcpy because of pointers */
1439 _mesa_copy_texture_state(src, dst);
1440 }
1441 if (mask & GL_TRANSFORM_BIT) {
1442 /* OK to memcpy */
1443 dst->Transform = src->Transform;
1444 }
1445 if (mask & GL_VIEWPORT_BIT) {
1446 /* Cannot use memcpy, because of pointers in GLmatrix _WindowMap */
1447 dst->Viewport.X = src->Viewport.X;
1448 dst->Viewport.Y = src->Viewport.Y;
1449 dst->Viewport.Width = src->Viewport.Width;
1450 dst->Viewport.Height = src->Viewport.Height;
1451 dst->Viewport.Near = src->Viewport.Near;
1452 dst->Viewport.Far = src->Viewport.Far;
1453 _math_matrix_copy(&dst->Viewport._WindowMap, &src->Viewport._WindowMap);
1454 }
1455
1456 /* XXX FIXME: Call callbacks?
1457 */
1458 dst->NewState = _NEW_ALL;
1459 }
1460 #endif
1461
1462
1463 /**
1464 * Check if the given context can render into the given framebuffer
1465 * by checking visual attributes.
1466 * \return GL_TRUE if compatible, GL_FALSE otherwise.
1467 */
1468 static GLboolean
1469 check_compatible(const GLcontext *ctx, const GLframebuffer *buffer)
1470 {
1471 const GLvisual *ctxvis = &ctx->Visual;
1472 const GLvisual *bufvis = &buffer->Visual;
1473
1474 if (ctxvis == bufvis)
1475 return GL_TRUE;
1476
1477 if (ctxvis->rgbMode != bufvis->rgbMode)
1478 return GL_FALSE;
1479 if (ctxvis->doubleBufferMode && !bufvis->doubleBufferMode)
1480 return GL_FALSE;
1481 if (ctxvis->stereoMode && !bufvis->stereoMode)
1482 return GL_FALSE;
1483 if (ctxvis->haveAccumBuffer && !bufvis->haveAccumBuffer)
1484 return GL_FALSE;
1485 if (ctxvis->haveDepthBuffer && !bufvis->haveDepthBuffer)
1486 return GL_FALSE;
1487 if (ctxvis->haveStencilBuffer && !bufvis->haveStencilBuffer)
1488 return GL_FALSE;
1489 if (ctxvis->redMask && ctxvis->redMask != bufvis->redMask)
1490 return GL_FALSE;
1491 if (ctxvis->greenMask && ctxvis->greenMask != bufvis->greenMask)
1492 return GL_FALSE;
1493 if (ctxvis->blueMask && ctxvis->blueMask != bufvis->blueMask)
1494 return GL_FALSE;
1495 if (ctxvis->depthBits && ctxvis->depthBits != bufvis->depthBits)
1496 return GL_FALSE;
1497 if (ctxvis->stencilBits && ctxvis->stencilBits != bufvis->stencilBits)
1498 return GL_FALSE;
1499
1500 return GL_TRUE;
1501 }
1502
1503
1504 /**
1505 * Bind the given context to the given draw-buffer and read-buffer and
1506 * make it the current context for this thread.
1507 *
1508 * \param newCtx new GL context. If NULL then there will be no current GL
1509 * context.
1510 * \param drawBuffer draw framebuffer.
1511 * \param readBuffer read framebuffer.
1512 *
1513 * Check that the context's and framebuffer's visuals are compatible, returning
1514 * immediately otherwise. Sets the glapi current context via
1515 * _glapi_set_context(). If \p newCtx is not NULL, associates \p drawBuffer and
1516 * \p readBuffer with it and calls dd_function_table::ResizeBuffers if the buffers size has changed.
1517 * Calls dd_function_table::MakeCurrent callback if defined.
1518 *
1519 * When a context is bound by the first time and the \c MESA_INFO environment
1520 * variable is set it calls print_info() as an aid for remote user
1521 * troubleshooting.
1522 */
1523 void
1524 _mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer,
1525 GLframebuffer *readBuffer )
1526 {
1527 if (MESA_VERBOSE & VERBOSE_API)
1528 _mesa_debug(newCtx, "_mesa_make_current()\n");
1529
1530 /* Check that the context's and framebuffer's visuals are compatible.
1531 */
1532 if (newCtx && drawBuffer && newCtx->DrawBuffer != drawBuffer) {
1533 if (!check_compatible(newCtx, drawBuffer))
1534 return;
1535 }
1536 if (newCtx && readBuffer && newCtx->ReadBuffer != readBuffer) {
1537 if (!check_compatible(newCtx, readBuffer))
1538 return;
1539 }
1540
1541 /* We call this function periodically (just here for now) in
1542 * order to detect when multithreading has begun.
1543 */
1544 _glapi_check_multithread();
1545
1546 _glapi_set_context((void *) newCtx);
1547 ASSERT(_mesa_get_current_context() == newCtx);
1548
1549 if (!newCtx) {
1550 _glapi_set_dispatch(NULL); /* none current */
1551 }
1552 else {
1553 _glapi_set_dispatch(newCtx->CurrentDispatch);
1554
1555 if (drawBuffer && readBuffer) {
1556 /* TODO: check if newCtx and buffer's visual match??? */
1557
1558 #if NEW_RENDERBUFFER
1559 ASSERT(drawBuffer->Name == 0);
1560 ASSERT(readBuffer->Name == 0);
1561 newCtx->WinSysDrawBuffer = drawBuffer;
1562 newCtx->WinSysReadBuffer = readBuffer;
1563 /* don't replace user-buffer bindings with window system buffer */
1564 if (!newCtx->DrawBuffer || newCtx->DrawBuffer->Name == 0) {
1565 newCtx->DrawBuffer = drawBuffer;
1566 newCtx->ReadBuffer = readBuffer;
1567 }
1568 #else
1569 newCtx->DrawBuffer = drawBuffer;
1570 newCtx->ReadBuffer = readBuffer;
1571 #endif
1572 newCtx->NewState |= _NEW_BUFFERS;
1573
1574 #if _HAVE_FULL_GL
1575 if (!drawBuffer->Initialized) {
1576 /* get initial window size */
1577 GLuint bufWidth, bufHeight;
1578 /* ask device driver for size of the buffer */
1579 (*newCtx->Driver.GetBufferSize)(drawBuffer, &bufWidth, &bufHeight);
1580 /* set initial buffer size */
1581 if (newCtx->Driver.ResizeBuffers)
1582 newCtx->Driver.ResizeBuffers(newCtx, drawBuffer,
1583 bufWidth, bufHeight);
1584 drawBuffer->Initialized = GL_TRUE;
1585 }
1586
1587 if (readBuffer != drawBuffer && !readBuffer->Initialized) {
1588 /* get initial window size */
1589 GLuint bufWidth, bufHeight;
1590 /* ask device driver for size of the buffer */
1591 (*newCtx->Driver.GetBufferSize)(readBuffer, &bufWidth, &bufHeight);
1592 /* set initial buffer size */
1593 if (newCtx->Driver.ResizeBuffers)
1594 newCtx->Driver.ResizeBuffers(newCtx, readBuffer,
1595 bufWidth, bufHeight);
1596 readBuffer->Initialized = GL_TRUE;
1597 }
1598 #endif
1599 if (newCtx->FirstTimeCurrent) {
1600 /* set initial viewport and scissor size now */
1601 _mesa_set_viewport(newCtx, 0, 0, drawBuffer->Width, drawBuffer->Height);
1602 newCtx->Scissor.Width = drawBuffer->Width;
1603 newCtx->Scissor.Height = drawBuffer->Height;
1604 }
1605 }
1606
1607 /* Alert the driver - usually passed on to the sw t&l module,
1608 * but also used to detect threaded cases in the radeon codegen
1609 * hw t&l module.
1610 */
1611 if (newCtx->Driver.MakeCurrent)
1612 newCtx->Driver.MakeCurrent( newCtx, drawBuffer, readBuffer );
1613
1614 /* We can use this to help debug user's problems. Tell them to set
1615 * the MESA_INFO env variable before running their app. Then the
1616 * first time each context is made current we'll print some useful
1617 * information.
1618 */
1619 if (newCtx->FirstTimeCurrent) {
1620 if (_mesa_getenv("MESA_INFO")) {
1621 _mesa_print_info();
1622 }
1623 newCtx->FirstTimeCurrent = GL_FALSE;
1624 }
1625 }
1626 }
1627
1628
1629 /**
1630 * Make context 'ctx' share the display lists, textures and programs
1631 * that are associated with 'ctxToShare'.
1632 * Any display lists, textures or programs associated with 'ctx' will
1633 * be deleted if nobody else is sharing them.
1634 */
1635 GLboolean
1636 _mesa_share_state(GLcontext *ctx, GLcontext *ctxToShare)
1637 {
1638 if (ctx && ctxToShare && ctx->Shared && ctxToShare->Shared) {
1639 ctx->Shared->RefCount--;
1640 if (ctx->Shared->RefCount == 0) {
1641 free_shared_state(ctx, ctx->Shared);
1642 }
1643 ctx->Shared = ctxToShare->Shared;
1644 ctx->Shared->RefCount++;
1645 return GL_TRUE;
1646 }
1647 else {
1648 return GL_FALSE;
1649 }
1650 }
1651
1652
1653
1654 /**
1655 * Get current context for the calling thread.
1656 *
1657 * \return pointer to the current GL context.
1658 *
1659 * Calls _glapi_get_context(). This isn't the fastest way to get the current
1660 * context. If you need speed, see the #GET_CURRENT_CONTEXT macro in context.h.
1661 */
1662 GLcontext *
1663 _mesa_get_current_context( void )
1664 {
1665 return (GLcontext *) _glapi_get_context();
1666 }
1667
1668 /**
1669 * Get context's current API dispatch table.
1670 *
1671 * It'll either be the immediate-mode execute dispatcher or the display list
1672 * compile dispatcher.
1673 *
1674 * \param ctx GL context.
1675 *
1676 * \return pointer to dispatch_table.
1677 *
1678 * Simply returns __GLcontextRec::CurrentDispatch.
1679 */
1680 struct _glapi_table *
1681 _mesa_get_dispatch(GLcontext *ctx)
1682 {
1683 return ctx->CurrentDispatch;
1684 }
1685
1686 /*@}*/
1687
1688
1689 /**********************************************************************/
1690 /** \name Miscellaneous functions */
1691 /**********************************************************************/
1692 /*@{*/
1693
1694 /**
1695 * Record an error.
1696 *
1697 * \param ctx GL context.
1698 * \param error error code.
1699 *
1700 * Records the given error code and call the driver's dd_function_table::Error
1701 * function if defined.
1702 *
1703 * \sa
1704 * This is called via _mesa_error().
1705 */
1706 void
1707 _mesa_record_error( GLcontext *ctx, GLenum error )
1708 {
1709 if (!ctx)
1710 return;
1711
1712 if (ctx->ErrorValue == GL_NO_ERROR) {
1713 ctx->ErrorValue = error;
1714 }
1715
1716 /* Call device driver's error handler, if any. This is used on the Mac. */
1717 if (ctx->Driver.Error) {
1718 (*ctx->Driver.Error)( ctx );
1719 }
1720 }
1721
1722 /**
1723 * Execute glFinish().
1724 *
1725 * Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the
1726 * dd_function_table::Finish driver callback, if not NULL.
1727 */
1728 void GLAPIENTRY
1729 _mesa_Finish( void )
1730 {
1731 GET_CURRENT_CONTEXT(ctx);
1732 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1733 if (ctx->Driver.Finish) {
1734 (*ctx->Driver.Finish)( ctx );
1735 }
1736 }
1737
1738 /**
1739 * Execute glFlush().
1740 *
1741 * Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the
1742 * dd_function_table::Flush driver callback, if not NULL.
1743 */
1744 void GLAPIENTRY
1745 _mesa_Flush( void )
1746 {
1747 GET_CURRENT_CONTEXT(ctx);
1748 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1749 if (ctx->Driver.Flush) {
1750 (*ctx->Driver.Flush)( ctx );
1751 }
1752 }
1753
1754
1755 /*@}*/