mesa: Move struct _glapi_table allocation out of context.c
[mesa.git] / src / mesa / main / context.c
1 /*
2 * Mesa 3-D graphics library
3 * Version: 7.3
4 *
5 * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
6 * Copyright (C) 2008 VMware, Inc. All Rights Reserved.
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included
16 * in all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 */
25
26 /**
27 * \file context.c
28 * Mesa context/visual/framebuffer management functions.
29 * \author Brian Paul
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 "mfeatures.h"
81 #include "imports.h"
82 #include "accum.h"
83 #include "api_exec.h"
84 #include "arrayobj.h"
85 #include "attrib.h"
86 #include "blend.h"
87 #include "buffers.h"
88 #include "bufferobj.h"
89 #include "colortab.h"
90 #include "context.h"
91 #include "cpuinfo.h"
92 #include "debug.h"
93 #include "depth.h"
94 #include "dlist.h"
95 #include "eval.h"
96 #include "extensions.h"
97 #include "fbobject.h"
98 #include "feedback.h"
99 #include "fog.h"
100 #include "framebuffer.h"
101 #include "histogram.h"
102 #include "hint.h"
103 #include "hash.h"
104 #include "light.h"
105 #include "lines.h"
106 #include "macros.h"
107 #include "matrix.h"
108 #include "multisample.h"
109 #include "pixel.h"
110 #include "pixelstore.h"
111 #include "points.h"
112 #include "polygon.h"
113 #include "queryobj.h"
114 #if FEATURE_ARB_sync
115 #include "syncobj.h"
116 #endif
117 #include "rastpos.h"
118 #include "remap.h"
119 #include "scissor.h"
120 #include "shared.h"
121 #include "simple_list.h"
122 #include "state.h"
123 #include "stencil.h"
124 #include "texcompress_s3tc.h"
125 #include "texstate.h"
126 #include "transformfeedback.h"
127 #include "mtypes.h"
128 #include "varray.h"
129 #include "version.h"
130 #include "viewport.h"
131 #include "vtxfmt.h"
132 #include "shader/program.h"
133 #include "shader/prog_print.h"
134 #include "shader/shader_api.h"
135 #if _HAVE_FULL_GL
136 #include "math/m_matrix.h"
137 #endif
138
139 #ifdef USE_SPARC_ASM
140 #include "sparc/sparc.h"
141 #endif
142
143 #ifndef MESA_VERBOSE
144 int MESA_VERBOSE = 0;
145 #endif
146
147 #ifndef MESA_DEBUG_FLAGS
148 int MESA_DEBUG_FLAGS = 0;
149 #endif
150
151
152 /* ubyte -> float conversion */
153 GLfloat _mesa_ubyte_to_float_color_tab[256];
154
155
156
157 /**
158 * Swap buffers notification callback.
159 *
160 * \param ctx 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 *ctx)
167 {
168 if (MESA_VERBOSE & VERBOSE_SWAPBUFFERS)
169 _mesa_debug(ctx, "SwapBuffers\n");
170 FLUSH_CURRENT( ctx, 0 );
171 if (ctx->Driver.Flush) {
172 ctx->Driver.Flush(ctx);
173 }
174 }
175
176
177 /**********************************************************************/
178 /** \name GL Visual allocation/destruction */
179 /**********************************************************************/
180 /*@{*/
181
182 /**
183 * Allocates a GLvisual structure and initializes it via
184 * _mesa_initialize_visual().
185 *
186 * \param dbFlag double buffering
187 * \param stereoFlag stereo buffer
188 * \param depthBits requested bits per depth buffer value. Any value in [0, 32]
189 * is acceptable but the actual depth type will be GLushort or GLuint as
190 * needed.
191 * \param stencilBits requested minimum bits per stencil buffer value
192 * \param accumRedBits, accumGreenBits, accumBlueBits, accumAlphaBits number of bits per color component in accum buffer.
193 * \param indexBits number of bits per pixel if \p rgbFlag is GL_FALSE
194 * \param redBits number of bits per color component in frame buffer for RGB(A)
195 * mode. We always use 8 in core Mesa though.
196 * \param greenBits same as above.
197 * \param blueBits same as above.
198 * \param alphaBits same as above.
199 * \param numSamples not really used.
200 *
201 * \return pointer to new GLvisual or NULL if requested parameters can't be
202 * met.
203 *
204 * \note Need to add params for level and numAuxBuffers (at least)
205 */
206 GLvisual *
207 _mesa_create_visual( GLboolean dbFlag,
208 GLboolean stereoFlag,
209 GLint redBits,
210 GLint greenBits,
211 GLint blueBits,
212 GLint alphaBits,
213 GLint depthBits,
214 GLint stencilBits,
215 GLint accumRedBits,
216 GLint accumGreenBits,
217 GLint accumBlueBits,
218 GLint accumAlphaBits,
219 GLint numSamples )
220 {
221 GLvisual *vis = (GLvisual *) calloc(1, sizeof(GLvisual));
222 if (vis) {
223 if (!_mesa_initialize_visual(vis, dbFlag, stereoFlag,
224 redBits, greenBits, blueBits, alphaBits,
225 depthBits, stencilBits,
226 accumRedBits, accumGreenBits,
227 accumBlueBits, accumAlphaBits,
228 numSamples)) {
229 free(vis);
230 return NULL;
231 }
232 }
233 return vis;
234 }
235
236 /**
237 * Makes some sanity checks and fills in the fields of the
238 * GLvisual object with the given parameters. If the caller needs
239 * to set additional fields, he should just probably init the whole GLvisual
240 * object himself.
241 * \return GL_TRUE on success, or GL_FALSE on failure.
242 *
243 * \sa _mesa_create_visual() above for the parameter description.
244 */
245 GLboolean
246 _mesa_initialize_visual( GLvisual *vis,
247 GLboolean dbFlag,
248 GLboolean stereoFlag,
249 GLint redBits,
250 GLint greenBits,
251 GLint blueBits,
252 GLint alphaBits,
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 = GL_TRUE;
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 = 0;
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 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 /**
334 * This is lame. gdb only seems to recognize enum types that are
335 * actually used somewhere. We want to be able to print/use enum
336 * values such as TEXTURE_2D_INDEX in gdb. But we don't actually use
337 * the gl_texture_index type anywhere. Thus, this lame function.
338 */
339 static void
340 dummy_enum_func(void)
341 {
342 gl_buffer_index bi;
343 gl_colortable_index ci;
344 gl_face_index fi;
345 gl_frag_attrib fa;
346 gl_frag_result fr;
347 gl_texture_index ti;
348 gl_vert_attrib va;
349 gl_vert_result vr;
350
351 (void) bi;
352 (void) ci;
353 (void) fi;
354 (void) fa;
355 (void) fr;
356 (void) ti;
357 (void) va;
358 (void) vr;
359 }
360
361
362 /**
363 * One-time initialization mutex lock.
364 *
365 * \sa Used by one_time_init().
366 */
367 _glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
368
369 /**
370 * Calls all the various one-time-init functions in Mesa.
371 *
372 * While holding a global mutex lock, calls several initialization functions,
373 * and sets the glapi callbacks if the \c MESA_DEBUG environment variable is
374 * defined.
375 *
376 * \sa _math_init().
377 */
378 static void
379 one_time_init( GLcontext *ctx )
380 {
381 static GLboolean alreadyCalled = GL_FALSE;
382 (void) ctx;
383 _glthread_LOCK_MUTEX(OneTimeLock);
384 if (!alreadyCalled) {
385 GLuint i;
386
387 /* do some implementation tests */
388 assert( sizeof(GLbyte) == 1 );
389 assert( sizeof(GLubyte) == 1 );
390 assert( sizeof(GLshort) == 2 );
391 assert( sizeof(GLushort) == 2 );
392 assert( sizeof(GLint) == 4 );
393 assert( sizeof(GLuint) == 4 );
394
395 _mesa_get_cpu_features();
396
397 _mesa_init_remap_table();
398
399 _mesa_init_sqrt_table();
400
401 for (i = 0; i < 256; i++) {
402 _mesa_ubyte_to_float_color_tab[i] = (float) i / 255.0F;
403 }
404
405 #if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
406 _mesa_debug(ctx, "Mesa %s DEBUG build %s %s\n",
407 MESA_VERSION_STRING, __DATE__, __TIME__);
408 #endif
409
410 alreadyCalled = GL_TRUE;
411 }
412 _glthread_UNLOCK_MUTEX(OneTimeLock);
413
414 dummy_enum_func();
415 }
416
417
418 /**
419 * Initialize fields of gl_current_attrib (aka ctx->Current.*)
420 */
421 static void
422 _mesa_init_current(GLcontext *ctx)
423 {
424 GLuint i;
425
426 /* Init all to (0,0,0,1) */
427 for (i = 0; i < Elements(ctx->Current.Attrib); i++) {
428 ASSIGN_4V( ctx->Current.Attrib[i], 0.0, 0.0, 0.0, 1.0 );
429 }
430
431 /* redo special cases: */
432 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_WEIGHT], 1.0, 0.0, 0.0, 0.0 );
433 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 1.0 );
434 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 );
435 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR1], 0.0, 0.0, 0.0, 1.0 );
436 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR_INDEX], 1.0, 0.0, 0.0, 1.0 );
437 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_EDGEFLAG], 1.0, 0.0, 0.0, 1.0 );
438 }
439
440
441 /**
442 * Init vertex/fragment program limits.
443 * Important: drivers should override these with actual limits.
444 */
445 static void
446 init_program_limits(GLenum type, struct gl_program_constants *prog)
447 {
448 prog->MaxInstructions = MAX_PROGRAM_INSTRUCTIONS;
449 prog->MaxAluInstructions = MAX_PROGRAM_INSTRUCTIONS;
450 prog->MaxTexInstructions = MAX_PROGRAM_INSTRUCTIONS;
451 prog->MaxTexIndirections = MAX_PROGRAM_INSTRUCTIONS;
452 prog->MaxTemps = MAX_PROGRAM_TEMPS;
453 prog->MaxEnvParams = MAX_PROGRAM_ENV_PARAMS;
454 prog->MaxLocalParams = MAX_PROGRAM_LOCAL_PARAMS;
455 prog->MaxUniformComponents = 4 * MAX_UNIFORMS;
456
457 if (type == GL_VERTEX_PROGRAM_ARB) {
458 prog->MaxParameters = MAX_VERTEX_PROGRAM_PARAMS;
459 prog->MaxAttribs = MAX_NV_VERTEX_PROGRAM_INPUTS;
460 prog->MaxAddressRegs = MAX_VERTEX_PROGRAM_ADDRESS_REGS;
461 }
462 else {
463 prog->MaxParameters = MAX_NV_FRAGMENT_PROGRAM_PARAMS;
464 prog->MaxAttribs = MAX_NV_FRAGMENT_PROGRAM_INPUTS;
465 prog->MaxAddressRegs = MAX_FRAGMENT_PROGRAM_ADDRESS_REGS;
466 }
467
468 /* Set the native limits to zero. This implies that there is no native
469 * support for shaders. Let the drivers fill in the actual values.
470 */
471 prog->MaxNativeInstructions = 0;
472 prog->MaxNativeAluInstructions = 0;
473 prog->MaxNativeTexInstructions = 0;
474 prog->MaxNativeTexIndirections = 0;
475 prog->MaxNativeAttribs = 0;
476 prog->MaxNativeTemps = 0;
477 prog->MaxNativeAddressRegs = 0;
478 prog->MaxNativeParameters = 0;
479 }
480
481
482 /**
483 * Initialize fields of gl_constants (aka ctx->Const.*).
484 * Use defaults from config.h. The device drivers will often override
485 * some of these values (such as number of texture units).
486 */
487 static void
488 _mesa_init_constants(GLcontext *ctx)
489 {
490 assert(ctx);
491
492 /* Constants, may be overriden (usually only reduced) by device drivers */
493 ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
494 ctx->Const.Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS;
495 ctx->Const.MaxCubeTextureLevels = MAX_CUBE_TEXTURE_LEVELS;
496 ctx->Const.MaxTextureRectSize = MAX_TEXTURE_RECT_SIZE;
497 ctx->Const.MaxArrayTextureLayers = MAX_ARRAY_TEXTURE_LAYERS;
498 ctx->Const.MaxTextureCoordUnits = MAX_TEXTURE_COORD_UNITS;
499 ctx->Const.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
500 ctx->Const.MaxTextureUnits = MIN2(ctx->Const.MaxTextureCoordUnits,
501 ctx->Const.MaxTextureImageUnits);
502 ctx->Const.MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY;
503 ctx->Const.MaxTextureLodBias = MAX_TEXTURE_LOD_BIAS;
504 ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
505 ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
506 ctx->Const.MinPointSize = MIN_POINT_SIZE;
507 ctx->Const.MaxPointSize = MAX_POINT_SIZE;
508 ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
509 ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
510 ctx->Const.PointSizeGranularity = (GLfloat) POINT_SIZE_GRANULARITY;
511 ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
512 ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
513 ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
514 ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
515 ctx->Const.LineWidthGranularity = (GLfloat) LINE_WIDTH_GRANULARITY;
516 ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
517 ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
518 ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
519 ctx->Const.MaxClipPlanes = MAX_CLIP_PLANES;
520 ctx->Const.MaxLights = MAX_LIGHTS;
521 ctx->Const.MaxShininess = 128.0;
522 ctx->Const.MaxSpotExponent = 128.0;
523 ctx->Const.MaxViewportWidth = MAX_WIDTH;
524 ctx->Const.MaxViewportHeight = MAX_HEIGHT;
525 #if FEATURE_ARB_vertex_program
526 init_program_limits(GL_VERTEX_PROGRAM_ARB, &ctx->Const.VertexProgram);
527 #endif
528 #if FEATURE_ARB_fragment_program
529 init_program_limits(GL_FRAGMENT_PROGRAM_ARB, &ctx->Const.FragmentProgram);
530 #endif
531 ctx->Const.MaxProgramMatrices = MAX_PROGRAM_MATRICES;
532 ctx->Const.MaxProgramMatrixStackDepth = MAX_PROGRAM_MATRIX_STACK_DEPTH;
533
534 /* CheckArrayBounds is overriden by drivers/x11 for X server */
535 ctx->Const.CheckArrayBounds = GL_FALSE;
536
537 /* GL_ARB_draw_buffers */
538 ctx->Const.MaxDrawBuffers = MAX_DRAW_BUFFERS;
539
540 #if FEATURE_EXT_framebuffer_object
541 ctx->Const.MaxColorAttachments = MAX_COLOR_ATTACHMENTS;
542 ctx->Const.MaxRenderbufferSize = MAX_WIDTH;
543 #endif
544
545 #if FEATURE_ARB_vertex_shader
546 ctx->Const.MaxVertexTextureImageUnits = MAX_VERTEX_TEXTURE_IMAGE_UNITS;
547 ctx->Const.MaxCombinedTextureImageUnits = MAX_COMBINED_TEXTURE_IMAGE_UNITS;
548 ctx->Const.MaxVarying = MAX_VARYING;
549 #endif
550
551 /* GL_ARB_framebuffer_object */
552 ctx->Const.MaxSamples = 0;
553
554 /* GL_ARB_sync */
555 ctx->Const.MaxServerWaitTimeout = (GLuint64) ~0;
556
557 /* GL_ATI_envmap_bumpmap */
558 ctx->Const.SupportedBumpUnits = SUPPORTED_ATI_BUMP_UNITS;
559
560 /* GL_EXT_provoking_vertex */
561 ctx->Const.QuadsFollowProvokingVertexConvention = GL_TRUE;
562
563 /* GL_EXT_transform_feedback */
564 ctx->Const.MaxTransformFeedbackSeparateAttribs = MAX_FEEDBACK_ATTRIBS;
565 ctx->Const.MaxTransformFeedbackSeparateComponents = 4 * MAX_FEEDBACK_ATTRIBS;
566 ctx->Const.MaxTransformFeedbackInterleavedComponents = 4 * MAX_FEEDBACK_ATTRIBS;
567
568 /* GL 3.2: hard-coded for now: */
569 ctx->Const.ProfileMask = GL_CONTEXT_COMPATIBILITY_PROFILE_BIT;
570 }
571
572
573 /**
574 * Do some sanity checks on the limits/constants for the given context.
575 * Only called the first time a context is bound.
576 */
577 static void
578 check_context_limits(GLcontext *ctx)
579 {
580 /* check that we don't exceed the size of various bitfields */
581 assert(VERT_RESULT_MAX <=
582 (8 * sizeof(ctx->VertexProgram._Current->Base.OutputsWritten)));
583 assert(FRAG_ATTRIB_MAX <=
584 (8 * sizeof(ctx->FragmentProgram._Current->Base.InputsRead)));
585
586 assert(MAX_COMBINED_TEXTURE_IMAGE_UNITS <= 8 * sizeof(GLbitfield));
587
588 /* shader-related checks */
589 assert(ctx->Const.FragmentProgram.MaxLocalParams <= MAX_PROGRAM_LOCAL_PARAMS);
590 assert(ctx->Const.VertexProgram.MaxLocalParams <= MAX_PROGRAM_LOCAL_PARAMS);
591
592 assert(MAX_NV_FRAGMENT_PROGRAM_TEMPS <= MAX_PROGRAM_TEMPS);
593 assert(MAX_NV_VERTEX_PROGRAM_TEMPS <= MAX_PROGRAM_TEMPS);
594 assert(MAX_NV_VERTEX_PROGRAM_INPUTS <= VERT_ATTRIB_MAX);
595 assert(MAX_NV_VERTEX_PROGRAM_OUTPUTS <= VERT_RESULT_MAX);
596
597 /* Texture unit checks */
598 assert(ctx->Const.MaxTextureImageUnits > 0);
599 assert(ctx->Const.MaxTextureImageUnits <= MAX_TEXTURE_IMAGE_UNITS);
600 assert(ctx->Const.MaxTextureCoordUnits > 0);
601 assert(ctx->Const.MaxTextureCoordUnits <= MAX_TEXTURE_COORD_UNITS);
602 assert(ctx->Const.MaxTextureUnits > 0);
603 assert(ctx->Const.MaxTextureUnits <= MAX_TEXTURE_IMAGE_UNITS);
604 assert(ctx->Const.MaxTextureUnits <= MAX_TEXTURE_COORD_UNITS);
605 assert(ctx->Const.MaxTextureUnits == MIN2(ctx->Const.MaxTextureImageUnits,
606 ctx->Const.MaxTextureCoordUnits));
607 assert(ctx->Const.MaxCombinedTextureImageUnits > 0);
608 assert(ctx->Const.MaxCombinedTextureImageUnits <= MAX_COMBINED_TEXTURE_IMAGE_UNITS);
609 assert(ctx->Const.MaxTextureCoordUnits <= MAX_COMBINED_TEXTURE_IMAGE_UNITS);
610 /* number of coord units cannot be greater than number of image units */
611 assert(ctx->Const.MaxTextureCoordUnits <= ctx->Const.MaxTextureImageUnits);
612
613
614 /* Texture size checks */
615 assert(ctx->Const.MaxTextureLevels <= MAX_TEXTURE_LEVELS);
616 assert(ctx->Const.Max3DTextureLevels <= MAX_3D_TEXTURE_LEVELS);
617 assert(ctx->Const.MaxCubeTextureLevels <= MAX_CUBE_TEXTURE_LEVELS);
618 assert(ctx->Const.MaxTextureRectSize <= MAX_TEXTURE_RECT_SIZE);
619
620 /* make sure largest texture image is <= MAX_WIDTH in size */
621 assert((1 << (ctx->Const.MaxTextureLevels - 1)) <= MAX_WIDTH);
622 assert((1 << (ctx->Const.MaxCubeTextureLevels - 1)) <= MAX_WIDTH);
623 assert((1 << (ctx->Const.Max3DTextureLevels - 1)) <= MAX_WIDTH);
624
625 /* Texture level checks */
626 assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);
627 assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);
628
629 /* Max texture size should be <= max viewport size (render to texture) */
630 assert((1 << (MAX_TEXTURE_LEVELS - 1)) <= MAX_WIDTH);
631
632 assert(ctx->Const.MaxViewportWidth <= MAX_WIDTH);
633 assert(ctx->Const.MaxViewportHeight <= MAX_WIDTH);
634
635 assert(ctx->Const.MaxDrawBuffers <= MAX_DRAW_BUFFERS);
636
637 /* XXX probably add more tests */
638 }
639
640
641 /**
642 * Initialize the attribute groups in a GL context.
643 *
644 * \param ctx GL context.
645 *
646 * Initializes all the attributes, calling the respective <tt>init*</tt>
647 * functions for the more complex data structures.
648 */
649 static GLboolean
650 init_attrib_groups(GLcontext *ctx)
651 {
652 assert(ctx);
653
654 /* Constants */
655 _mesa_init_constants( ctx );
656
657 /* Extensions */
658 _mesa_init_extensions( ctx );
659
660 /* Attribute Groups */
661 _mesa_init_accum( ctx );
662 _mesa_init_attrib( ctx );
663 _mesa_init_buffer_objects( ctx );
664 _mesa_init_color( ctx );
665 _mesa_init_colortables( ctx );
666 _mesa_init_current( ctx );
667 _mesa_init_depth( ctx );
668 _mesa_init_debug( ctx );
669 _mesa_init_display_list( ctx );
670 _mesa_init_eval( ctx );
671 _mesa_init_fbobjects( ctx );
672 _mesa_init_feedback( ctx );
673 _mesa_init_fog( ctx );
674 _mesa_init_histogram( ctx );
675 _mesa_init_hint( ctx );
676 _mesa_init_line( ctx );
677 _mesa_init_lighting( ctx );
678 _mesa_init_matrix( ctx );
679 _mesa_init_multisample( ctx );
680 _mesa_init_pixel( ctx );
681 _mesa_init_pixelstore( ctx );
682 _mesa_init_point( ctx );
683 _mesa_init_polygon( ctx );
684 _mesa_init_program( ctx );
685 _mesa_init_queryobj( ctx );
686 #if FEATURE_ARB_sync
687 _mesa_init_sync( ctx );
688 #endif
689 _mesa_init_rastpos( ctx );
690 _mesa_init_scissor( ctx );
691 _mesa_init_shader_state( ctx );
692 _mesa_init_stencil( ctx );
693 _mesa_init_transform( ctx );
694 _mesa_init_transform_feedback( ctx );
695 _mesa_init_varray( ctx );
696 _mesa_init_viewport( ctx );
697
698 if (!_mesa_init_texture( ctx ))
699 return GL_FALSE;
700
701 _mesa_init_texture_s3tc( ctx );
702
703 /* Miscellaneous */
704 ctx->NewState = _NEW_ALL;
705 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
706 ctx->varying_vp_inputs = ~0;
707
708 return GL_TRUE;
709 }
710
711
712 /**
713 * Update default objects in a GL context with respect to shared state.
714 *
715 * \param ctx GL context.
716 *
717 * Removes references to old default objects, (texture objects, program
718 * objects, etc.) and changes to reference those from the current shared
719 * state.
720 */
721 static GLboolean
722 update_default_objects(GLcontext *ctx)
723 {
724 assert(ctx);
725
726 _mesa_update_default_objects_program(ctx);
727 _mesa_update_default_objects_texture(ctx);
728 _mesa_update_default_objects_buffer_objects(ctx);
729
730 return GL_TRUE;
731 }
732
733
734 /**
735 * This is the default function we plug into all dispatch table slots
736 * This helps prevents a segfault when someone calls a GL function without
737 * first checking if the extension's supported.
738 */
739 static int
740 generic_nop(void)
741 {
742 _mesa_warning(NULL, "User called no-op dispatch function (an unsupported extension function?)");
743 return 0;
744 }
745
746
747 /**
748 * Allocate and initialize a new dispatch table.
749 */
750 struct _glapi_table *
751 _mesa_alloc_dispatch_table(int size)
752 {
753 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
754 * In practice, this'll be the same for stand-alone Mesa. But for DRI
755 * Mesa we do this to accomodate different versions of libGL and various
756 * DRI drivers.
757 */
758 GLint numEntries = MAX2(_glapi_get_dispatch_table_size(),
759 size / sizeof(_glapi_proc));
760 struct _glapi_table *table =
761 (struct _glapi_table *) malloc(numEntries * sizeof(_glapi_proc));
762 if (table) {
763 _glapi_proc *entry = (_glapi_proc *) table;
764 GLint i;
765 for (i = 0; i < numEntries; i++) {
766 entry[i] = (_glapi_proc) generic_nop;
767 }
768 }
769 return table;
770 }
771
772
773 /**
774 * Initialize a GLcontext struct (rendering context).
775 *
776 * This includes allocating all the other structs and arrays which hang off of
777 * the context by pointers.
778 * Note that the driver needs to pass in its dd_function_table here since
779 * we need to at least call driverFunctions->NewTextureObject to create the
780 * default texture objects.
781 *
782 * Called by _mesa_create_context().
783 *
784 * Performs the imports and exports callback tables initialization, and
785 * miscellaneous one-time initializations. If no shared context is supplied one
786 * is allocated, and increase its reference count. Setups the GL API dispatch
787 * tables. Initialize the TNL module. Sets the maximum Z buffer depth.
788 * Finally queries the \c MESA_DEBUG and \c MESA_VERBOSE environment variables
789 * for debug flags.
790 *
791 * \param ctx the context to initialize
792 * \param api the GL API type to create the context for
793 * \param visual describes the visual attributes for this context
794 * \param share_list points to context to share textures, display lists,
795 * etc with, or NULL
796 * \param driverFunctions table of device driver functions for this context
797 * to use
798 * \param driverContext pointer to driver-specific context data
799 */
800 GLboolean
801 _mesa_initialize_context_for_api(GLcontext *ctx,
802 gl_api api,
803 const GLvisual *visual,
804 GLcontext *share_list,
805 const struct dd_function_table *driverFunctions,
806 void *driverContext)
807 {
808 struct gl_shared_state *shared;
809 int i;
810
811 /*ASSERT(driverContext);*/
812 assert(driverFunctions->NewTextureObject);
813 assert(driverFunctions->FreeTexImageData);
814
815 /* misc one-time initializations */
816 one_time_init(ctx);
817
818 ctx->API = api;
819 ctx->Visual = *visual;
820 ctx->DrawBuffer = NULL;
821 ctx->ReadBuffer = NULL;
822 ctx->WinSysDrawBuffer = NULL;
823 ctx->WinSysReadBuffer = NULL;
824
825 /* Plug in driver functions and context pointer here.
826 * This is important because when we call alloc_shared_state() below
827 * we'll call ctx->Driver.NewTextureObject() to create the default
828 * textures.
829 */
830 ctx->Driver = *driverFunctions;
831 ctx->DriverCtx = driverContext;
832
833 if (share_list) {
834 /* share state with another context */
835 shared = share_list->Shared;
836 }
837 else {
838 /* allocate new, unshared state */
839 shared = _mesa_alloc_shared_state(ctx);
840 if (!shared)
841 return GL_FALSE;
842 }
843
844 _glthread_LOCK_MUTEX(shared->Mutex);
845 ctx->Shared = shared;
846 shared->RefCount++;
847 _glthread_UNLOCK_MUTEX(shared->Mutex);
848
849 if (!init_attrib_groups( ctx )) {
850 _mesa_release_shared_state(ctx, ctx->Shared);
851 return GL_FALSE;
852 }
853
854 #if FEATURE_dispatch
855 /* setup the API dispatch tables */
856 ctx->Exec = _mesa_create_exec_table();
857 if (!ctx->Exec) {
858 _mesa_release_shared_state(ctx, ctx->Shared);
859 return GL_FALSE;
860 }
861 #endif
862 ctx->CurrentDispatch = ctx->Exec;
863
864 #if FEATURE_dlist
865 ctx->Save = _mesa_create_save_table();
866 if (!ctx->Save) {
867 _mesa_release_shared_state(ctx, ctx->Shared);
868 free(ctx->Exec);
869 return GL_FALSE;
870 }
871
872 _mesa_install_save_vtxfmt( ctx, &ctx->ListState.ListVtxfmt );
873 #endif
874
875 /* Neutral tnl module stuff */
876 _mesa_init_exec_vtxfmt( ctx );
877 ctx->TnlModule.Current = NULL;
878 ctx->TnlModule.SwapCount = 0;
879
880 ctx->FragmentProgram._MaintainTexEnvProgram
881 = (_mesa_getenv("MESA_TEX_PROG") != NULL);
882
883 ctx->VertexProgram._MaintainTnlProgram
884 = (_mesa_getenv("MESA_TNL_PROG") != NULL);
885 if (ctx->VertexProgram._MaintainTnlProgram) {
886 /* this is required... */
887 ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
888 }
889
890 switch (ctx->API) {
891 case API_OPENGL:
892 break;
893 case API_OPENGLES:
894 /**
895 * GL_OES_texture_cube_map says
896 * "Initially all texture generation modes are set to REFLECTION_MAP_OES"
897 */
898 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
899 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i];
900 texUnit->GenS.Mode = GL_REFLECTION_MAP_NV;
901 texUnit->GenT.Mode = GL_REFLECTION_MAP_NV;
902 texUnit->GenR.Mode = GL_REFLECTION_MAP_NV;
903 texUnit->GenS._ModeBit = TEXGEN_REFLECTION_MAP_NV;
904 texUnit->GenT._ModeBit = TEXGEN_REFLECTION_MAP_NV;
905 texUnit->GenR._ModeBit = TEXGEN_REFLECTION_MAP_NV;
906 }
907 break;
908 case API_OPENGLES2:
909 ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
910 ctx->VertexProgram._MaintainTnlProgram = GL_TRUE;
911 ctx->Point.PointSprite = GL_TRUE; /* always on for ES 2.x */
912 break;
913 }
914
915 ctx->FirstTimeCurrent = GL_TRUE;
916
917 return GL_TRUE;
918 }
919
920 GLboolean
921 _mesa_initialize_context(GLcontext *ctx,
922 const GLvisual *visual,
923 GLcontext *share_list,
924 const struct dd_function_table *driverFunctions,
925 void *driverContext)
926 {
927 return _mesa_initialize_context_for_api(ctx,
928 API_OPENGL,
929 visual,
930 share_list,
931 driverFunctions,
932 driverContext);
933 }
934
935 /**
936 * Allocate and initialize a GLcontext structure.
937 * Note that the driver needs to pass in its dd_function_table here since
938 * we need to at least call driverFunctions->NewTextureObject to initialize
939 * the rendering context.
940 *
941 * \param api the GL API type to create the context for
942 * \param visual a GLvisual pointer (we copy the struct contents)
943 * \param share_list another context to share display lists with or NULL
944 * \param driverFunctions points to the dd_function_table into which the
945 * driver has plugged in all its special functions.
946 * \param driverContext points to the device driver's private context state
947 *
948 * \return pointer to a new __GLcontextRec or NULL if error.
949 */
950 GLcontext *
951 _mesa_create_context_for_api(gl_api api,
952 const GLvisual *visual,
953 GLcontext *share_list,
954 const struct dd_function_table *driverFunctions,
955 void *driverContext)
956 {
957 GLcontext *ctx;
958
959 ASSERT(visual);
960 /*ASSERT(driverContext);*/
961
962 ctx = (GLcontext *) calloc(1, sizeof(GLcontext));
963 if (!ctx)
964 return NULL;
965
966 if (_mesa_initialize_context_for_api(ctx, api, visual, share_list,
967 driverFunctions, driverContext)) {
968 return ctx;
969 }
970 else {
971 free(ctx);
972 return NULL;
973 }
974 }
975
976 GLcontext *
977 _mesa_create_context(const GLvisual *visual,
978 GLcontext *share_list,
979 const struct dd_function_table *driverFunctions,
980 void *driverContext)
981 {
982 return _mesa_create_context_for_api(API_OPENGL, visual,
983 share_list,
984 driverFunctions,
985 driverContext);
986 }
987
988 /**
989 * Free the data associated with the given context.
990 *
991 * But doesn't free the GLcontext struct itself.
992 *
993 * \sa _mesa_initialize_context() and init_attrib_groups().
994 */
995 void
996 _mesa_free_context_data( GLcontext *ctx )
997 {
998 if (!_mesa_get_current_context()){
999 /* No current context, but we may need one in order to delete
1000 * texture objs, etc. So temporarily bind the context now.
1001 */
1002 _mesa_make_current(ctx, NULL, NULL);
1003 }
1004
1005 /* unreference WinSysDraw/Read buffers */
1006 _mesa_reference_framebuffer(&ctx->WinSysDrawBuffer, NULL);
1007 _mesa_reference_framebuffer(&ctx->WinSysReadBuffer, NULL);
1008 _mesa_reference_framebuffer(&ctx->DrawBuffer, NULL);
1009 _mesa_reference_framebuffer(&ctx->ReadBuffer, NULL);
1010
1011 _mesa_reference_vertprog(ctx, &ctx->VertexProgram.Current, NULL);
1012 _mesa_reference_vertprog(ctx, &ctx->VertexProgram._Current, NULL);
1013 _mesa_reference_vertprog(ctx, &ctx->VertexProgram._TnlProgram, NULL);
1014
1015 _mesa_reference_fragprog(ctx, &ctx->FragmentProgram.Current, NULL);
1016 _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current, NULL);
1017 _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._TexEnvProgram, NULL);
1018
1019 _mesa_free_attrib_data(ctx);
1020 _mesa_free_buffer_objects(ctx);
1021 _mesa_free_lighting_data( ctx );
1022 _mesa_free_eval_data( ctx );
1023 _mesa_free_texture_data( ctx );
1024 _mesa_free_matrix_data( ctx );
1025 _mesa_free_viewport_data( ctx );
1026 _mesa_free_colortables_data( ctx );
1027 _mesa_free_program_data(ctx);
1028 _mesa_free_shader_state(ctx);
1029 _mesa_free_queryobj_data(ctx);
1030 #if FEATURE_ARB_sync
1031 _mesa_free_sync_data(ctx);
1032 #endif
1033 _mesa_free_varray_data(ctx);
1034 _mesa_free_transform_feedback(ctx);
1035
1036 _mesa_delete_array_object(ctx, ctx->Array.DefaultArrayObj);
1037
1038 #if FEATURE_ARB_pixel_buffer_object
1039 _mesa_reference_buffer_object(ctx, &ctx->Pack.BufferObj, NULL);
1040 _mesa_reference_buffer_object(ctx, &ctx->Unpack.BufferObj, NULL);
1041 _mesa_reference_buffer_object(ctx, &ctx->DefaultPacking.BufferObj, NULL);
1042 #endif
1043
1044 #if FEATURE_ARB_vertex_buffer_object
1045 _mesa_reference_buffer_object(ctx, &ctx->Array.ArrayBufferObj, NULL);
1046 _mesa_reference_buffer_object(ctx, &ctx->Array.ElementArrayBufferObj, NULL);
1047 #endif
1048
1049 /* free dispatch tables */
1050 free(ctx->Exec);
1051 free(ctx->Save);
1052
1053 /* Shared context state (display lists, textures, etc) */
1054 _mesa_release_shared_state( ctx, ctx->Shared );
1055
1056 /* needs to be after freeing shared state */
1057 _mesa_free_display_list_data(ctx);
1058
1059 if (ctx->Extensions.String)
1060 free((void *) ctx->Extensions.String);
1061
1062 if (ctx->VersionString)
1063 free(ctx->VersionString);
1064
1065 /* unbind the context if it's currently bound */
1066 if (ctx == _mesa_get_current_context()) {
1067 _mesa_make_current(NULL, NULL, NULL);
1068 }
1069 }
1070
1071
1072 /**
1073 * Destroy a GLcontext structure.
1074 *
1075 * \param ctx GL context.
1076 *
1077 * Calls _mesa_free_context_data() and frees the GLcontext structure itself.
1078 */
1079 void
1080 _mesa_destroy_context( GLcontext *ctx )
1081 {
1082 if (ctx) {
1083 _mesa_free_context_data(ctx);
1084 free( (void *) ctx );
1085 }
1086 }
1087
1088
1089 #if _HAVE_FULL_GL
1090 /**
1091 * Copy attribute groups from one context to another.
1092 *
1093 * \param src source context
1094 * \param dst destination context
1095 * \param mask bitwise OR of GL_*_BIT flags
1096 *
1097 * According to the bits specified in \p mask, copies the corresponding
1098 * attributes from \p src into \p dst. For many of the attributes a simple \c
1099 * memcpy is not enough due to the existence of internal pointers in their data
1100 * structures.
1101 */
1102 void
1103 _mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
1104 {
1105 if (mask & GL_ACCUM_BUFFER_BIT) {
1106 /* OK to memcpy */
1107 dst->Accum = src->Accum;
1108 }
1109 if (mask & GL_COLOR_BUFFER_BIT) {
1110 /* OK to memcpy */
1111 dst->Color = src->Color;
1112 }
1113 if (mask & GL_CURRENT_BIT) {
1114 /* OK to memcpy */
1115 dst->Current = src->Current;
1116 }
1117 if (mask & GL_DEPTH_BUFFER_BIT) {
1118 /* OK to memcpy */
1119 dst->Depth = src->Depth;
1120 }
1121 if (mask & GL_ENABLE_BIT) {
1122 /* no op */
1123 }
1124 if (mask & GL_EVAL_BIT) {
1125 /* OK to memcpy */
1126 dst->Eval = src->Eval;
1127 }
1128 if (mask & GL_FOG_BIT) {
1129 /* OK to memcpy */
1130 dst->Fog = src->Fog;
1131 }
1132 if (mask & GL_HINT_BIT) {
1133 /* OK to memcpy */
1134 dst->Hint = src->Hint;
1135 }
1136 if (mask & GL_LIGHTING_BIT) {
1137 GLuint i;
1138 /* begin with memcpy */
1139 dst->Light = src->Light;
1140 /* fixup linked lists to prevent pointer insanity */
1141 make_empty_list( &(dst->Light.EnabledList) );
1142 for (i = 0; i < MAX_LIGHTS; i++) {
1143 if (dst->Light.Light[i].Enabled) {
1144 insert_at_tail(&(dst->Light.EnabledList), &(dst->Light.Light[i]));
1145 }
1146 }
1147 }
1148 if (mask & GL_LINE_BIT) {
1149 /* OK to memcpy */
1150 dst->Line = src->Line;
1151 }
1152 if (mask & GL_LIST_BIT) {
1153 /* OK to memcpy */
1154 dst->List = src->List;
1155 }
1156 if (mask & GL_PIXEL_MODE_BIT) {
1157 /* OK to memcpy */
1158 dst->Pixel = src->Pixel;
1159 }
1160 if (mask & GL_POINT_BIT) {
1161 /* OK to memcpy */
1162 dst->Point = src->Point;
1163 }
1164 if (mask & GL_POLYGON_BIT) {
1165 /* OK to memcpy */
1166 dst->Polygon = src->Polygon;
1167 }
1168 if (mask & GL_POLYGON_STIPPLE_BIT) {
1169 /* Use loop instead of memcpy due to problem with Portland Group's
1170 * C compiler. Reported by John Stone.
1171 */
1172 GLuint i;
1173 for (i = 0; i < 32; i++) {
1174 dst->PolygonStipple[i] = src->PolygonStipple[i];
1175 }
1176 }
1177 if (mask & GL_SCISSOR_BIT) {
1178 /* OK to memcpy */
1179 dst->Scissor = src->Scissor;
1180 }
1181 if (mask & GL_STENCIL_BUFFER_BIT) {
1182 /* OK to memcpy */
1183 dst->Stencil = src->Stencil;
1184 }
1185 if (mask & GL_TEXTURE_BIT) {
1186 /* Cannot memcpy because of pointers */
1187 _mesa_copy_texture_state(src, dst);
1188 }
1189 if (mask & GL_TRANSFORM_BIT) {
1190 /* OK to memcpy */
1191 dst->Transform = src->Transform;
1192 }
1193 if (mask & GL_VIEWPORT_BIT) {
1194 /* Cannot use memcpy, because of pointers in GLmatrix _WindowMap */
1195 dst->Viewport.X = src->Viewport.X;
1196 dst->Viewport.Y = src->Viewport.Y;
1197 dst->Viewport.Width = src->Viewport.Width;
1198 dst->Viewport.Height = src->Viewport.Height;
1199 dst->Viewport.Near = src->Viewport.Near;
1200 dst->Viewport.Far = src->Viewport.Far;
1201 _math_matrix_copy(&dst->Viewport._WindowMap, &src->Viewport._WindowMap);
1202 }
1203
1204 /* XXX FIXME: Call callbacks?
1205 */
1206 dst->NewState = _NEW_ALL;
1207 }
1208 #endif
1209
1210
1211 /**
1212 * Check if the given context can render into the given framebuffer
1213 * by checking visual attributes.
1214 *
1215 * Most of these tests could go away because Mesa is now pretty flexible
1216 * in terms of mixing rendering contexts with framebuffers. As long
1217 * as RGB vs. CI mode agree, we're probably good.
1218 *
1219 * \return GL_TRUE if compatible, GL_FALSE otherwise.
1220 */
1221 static GLboolean
1222 check_compatible(const GLcontext *ctx, const GLframebuffer *buffer)
1223 {
1224 const GLvisual *ctxvis = &ctx->Visual;
1225 const GLvisual *bufvis = &buffer->Visual;
1226
1227 if (ctxvis == bufvis)
1228 return GL_TRUE;
1229
1230 #if 0
1231 /* disabling this fixes the fgl_glxgears pbuffer demo */
1232 if (ctxvis->doubleBufferMode && !bufvis->doubleBufferMode)
1233 return GL_FALSE;
1234 #endif
1235 if (ctxvis->stereoMode && !bufvis->stereoMode)
1236 return GL_FALSE;
1237 if (ctxvis->haveAccumBuffer && !bufvis->haveAccumBuffer)
1238 return GL_FALSE;
1239 if (ctxvis->haveDepthBuffer && !bufvis->haveDepthBuffer)
1240 return GL_FALSE;
1241 if (ctxvis->haveStencilBuffer && !bufvis->haveStencilBuffer)
1242 return GL_FALSE;
1243 if (ctxvis->redMask && ctxvis->redMask != bufvis->redMask)
1244 return GL_FALSE;
1245 if (ctxvis->greenMask && ctxvis->greenMask != bufvis->greenMask)
1246 return GL_FALSE;
1247 if (ctxvis->blueMask && ctxvis->blueMask != bufvis->blueMask)
1248 return GL_FALSE;
1249 #if 0
1250 /* disabled (see bug 11161) */
1251 if (ctxvis->depthBits && ctxvis->depthBits != bufvis->depthBits)
1252 return GL_FALSE;
1253 #endif
1254 if (ctxvis->stencilBits && ctxvis->stencilBits != bufvis->stencilBits)
1255 return GL_FALSE;
1256
1257 return GL_TRUE;
1258 }
1259
1260
1261 /**
1262 * Do one-time initialization for the given framebuffer. Specifically,
1263 * ask the driver for the window's current size and update the framebuffer
1264 * object to match.
1265 * Really, the device driver should totally take care of this.
1266 */
1267 static void
1268 initialize_framebuffer_size(GLcontext *ctx, GLframebuffer *fb)
1269 {
1270 GLuint width, height;
1271 if (ctx->Driver.GetBufferSize) {
1272 ctx->Driver.GetBufferSize(fb, &width, &height);
1273 if (ctx->Driver.ResizeBuffers)
1274 ctx->Driver.ResizeBuffers(ctx, fb, width, height);
1275 fb->Initialized = GL_TRUE;
1276 }
1277 }
1278
1279
1280 /**
1281 * Check if the viewport/scissor size has not yet been initialized.
1282 * Initialize the size if the given width and height are non-zero.
1283 */
1284 void
1285 _mesa_check_init_viewport(GLcontext *ctx, GLuint width, GLuint height)
1286 {
1287 if (!ctx->ViewportInitialized && width > 0 && height > 0) {
1288 /* Note: set flag here, before calling _mesa_set_viewport(), to prevent
1289 * potential infinite recursion.
1290 */
1291 ctx->ViewportInitialized = GL_TRUE;
1292 _mesa_set_viewport(ctx, 0, 0, width, height);
1293 _mesa_set_scissor(ctx, 0, 0, width, height);
1294 }
1295 }
1296
1297
1298 /**
1299 * Bind the given context to the given drawBuffer and readBuffer and
1300 * make it the current context for the calling thread.
1301 * We'll render into the drawBuffer and read pixels from the
1302 * readBuffer (i.e. glRead/CopyPixels, glCopyTexImage, etc).
1303 *
1304 * We check that the context's and framebuffer's visuals are compatible
1305 * and return immediately if they're not.
1306 *
1307 * \param newCtx the new GL context. If NULL then there will be no current GL
1308 * context.
1309 * \param drawBuffer the drawing framebuffer
1310 * \param readBuffer the reading framebuffer
1311 */
1312 GLboolean
1313 _mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer,
1314 GLframebuffer *readBuffer )
1315 {
1316 if (MESA_VERBOSE & VERBOSE_API)
1317 _mesa_debug(newCtx, "_mesa_make_current()\n");
1318
1319 /* Check that the context's and framebuffer's visuals are compatible.
1320 */
1321 if (newCtx && drawBuffer && newCtx->WinSysDrawBuffer != drawBuffer) {
1322 if (!check_compatible(newCtx, drawBuffer)) {
1323 _mesa_warning(newCtx,
1324 "MakeCurrent: incompatible visuals for context and drawbuffer");
1325 return GL_FALSE;
1326 }
1327 }
1328 if (newCtx && readBuffer && newCtx->WinSysReadBuffer != readBuffer) {
1329 if (!check_compatible(newCtx, readBuffer)) {
1330 _mesa_warning(newCtx,
1331 "MakeCurrent: incompatible visuals for context and readbuffer");
1332 return GL_FALSE;
1333 }
1334 }
1335
1336 /* We used to call _glapi_check_multithread() here. Now do it in drivers */
1337 _glapi_set_context((void *) newCtx);
1338 ASSERT(_mesa_get_current_context() == newCtx);
1339
1340 if (!newCtx) {
1341 _glapi_set_dispatch(NULL); /* none current */
1342 }
1343 else {
1344 _glapi_set_dispatch(newCtx->CurrentDispatch);
1345
1346 if (drawBuffer && readBuffer) {
1347 /* TODO: check if newCtx and buffer's visual match??? */
1348
1349 ASSERT(drawBuffer->Name == 0);
1350 ASSERT(readBuffer->Name == 0);
1351 _mesa_reference_framebuffer(&newCtx->WinSysDrawBuffer, drawBuffer);
1352 _mesa_reference_framebuffer(&newCtx->WinSysReadBuffer, readBuffer);
1353
1354 /*
1355 * Only set the context's Draw/ReadBuffer fields if they're NULL
1356 * or not bound to a user-created FBO.
1357 */
1358 if (!newCtx->DrawBuffer || newCtx->DrawBuffer->Name == 0) {
1359 /* KW: merge conflict here, revisit.
1360 */
1361 /* fix up the fb fields - these will end up wrong otherwise
1362 * if the DRIdrawable changes, and everything relies on them.
1363 * This is a bit messy (same as needed in _mesa_BindFramebufferEXT)
1364 */
1365 unsigned int i;
1366 GLenum buffers[MAX_DRAW_BUFFERS];
1367
1368 _mesa_reference_framebuffer(&newCtx->DrawBuffer, drawBuffer);
1369
1370 for(i = 0; i < newCtx->Const.MaxDrawBuffers; i++) {
1371 buffers[i] = newCtx->Color.DrawBuffer[i];
1372 }
1373
1374 _mesa_drawbuffers(newCtx, newCtx->Const.MaxDrawBuffers, buffers, NULL);
1375 }
1376 if (!newCtx->ReadBuffer || newCtx->ReadBuffer->Name == 0) {
1377 _mesa_reference_framebuffer(&newCtx->ReadBuffer, readBuffer);
1378 }
1379
1380 /* XXX only set this flag if we're really changing the draw/read
1381 * framebuffer bindings.
1382 */
1383 newCtx->NewState |= _NEW_BUFFERS;
1384
1385 #if 1
1386 /* We want to get rid of these lines: */
1387
1388 #if _HAVE_FULL_GL
1389 if (!drawBuffer->Initialized) {
1390 initialize_framebuffer_size(newCtx, drawBuffer);
1391 }
1392 if (readBuffer != drawBuffer && !readBuffer->Initialized) {
1393 initialize_framebuffer_size(newCtx, readBuffer);
1394 }
1395
1396 _mesa_resizebuffers(newCtx);
1397 #endif
1398
1399 #else
1400 /* We want the drawBuffer and readBuffer to be initialized by
1401 * the driver.
1402 * This generally means the Width and Height match the actual
1403 * window size and the renderbuffers (both hardware and software
1404 * based) are allocated to match. The later can generally be
1405 * done with a call to _mesa_resize_framebuffer().
1406 *
1407 * It's theoretically possible for a buffer to have zero width
1408 * or height, but for now, assert check that the driver did what's
1409 * expected of it.
1410 */
1411 ASSERT(drawBuffer->Width > 0);
1412 ASSERT(drawBuffer->Height > 0);
1413 #endif
1414
1415 if (drawBuffer) {
1416 _mesa_check_init_viewport(newCtx,
1417 drawBuffer->Width, drawBuffer->Height);
1418 }
1419 }
1420
1421 if (newCtx->FirstTimeCurrent) {
1422 _mesa_compute_version(newCtx);
1423
1424 check_context_limits(newCtx);
1425
1426 /* We can use this to help debug user's problems. Tell them to set
1427 * the MESA_INFO env variable before running their app. Then the
1428 * first time each context is made current we'll print some useful
1429 * information.
1430 */
1431 if (_mesa_getenv("MESA_INFO")) {
1432 _mesa_print_info();
1433 }
1434
1435 newCtx->FirstTimeCurrent = GL_FALSE;
1436 }
1437 }
1438
1439 return GL_TRUE;
1440 }
1441
1442
1443 /**
1444 * Make context 'ctx' share the display lists, textures and programs
1445 * that are associated with 'ctxToShare'.
1446 * Any display lists, textures or programs associated with 'ctx' will
1447 * be deleted if nobody else is sharing them.
1448 */
1449 GLboolean
1450 _mesa_share_state(GLcontext *ctx, GLcontext *ctxToShare)
1451 {
1452 if (ctx && ctxToShare && ctx->Shared && ctxToShare->Shared) {
1453 struct gl_shared_state *oldSharedState = ctx->Shared;
1454
1455 ctx->Shared = ctxToShare->Shared;
1456
1457 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
1458 ctx->Shared->RefCount++;
1459 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1460
1461 update_default_objects(ctx);
1462
1463 _mesa_release_shared_state(ctx, oldSharedState);
1464
1465 return GL_TRUE;
1466 }
1467 else {
1468 return GL_FALSE;
1469 }
1470 }
1471
1472
1473
1474 /**
1475 * \return pointer to the current GL context for this thread.
1476 *
1477 * Calls _glapi_get_context(). This isn't the fastest way to get the current
1478 * context. If you need speed, see the #GET_CURRENT_CONTEXT macro in
1479 * context.h.
1480 */
1481 GLcontext *
1482 _mesa_get_current_context( void )
1483 {
1484 return (GLcontext *) _glapi_get_context();
1485 }
1486
1487
1488 /**
1489 * Get context's current API dispatch table.
1490 *
1491 * It'll either be the immediate-mode execute dispatcher or the display list
1492 * compile dispatcher.
1493 *
1494 * \param ctx GL context.
1495 *
1496 * \return pointer to dispatch_table.
1497 *
1498 * Simply returns __GLcontextRec::CurrentDispatch.
1499 */
1500 struct _glapi_table *
1501 _mesa_get_dispatch(GLcontext *ctx)
1502 {
1503 return ctx->CurrentDispatch;
1504 }
1505
1506 /*@}*/
1507
1508
1509 /**********************************************************************/
1510 /** \name Miscellaneous functions */
1511 /**********************************************************************/
1512 /*@{*/
1513
1514 /**
1515 * Record an error.
1516 *
1517 * \param ctx GL context.
1518 * \param error error code.
1519 *
1520 * Records the given error code and call the driver's dd_function_table::Error
1521 * function if defined.
1522 *
1523 * \sa
1524 * This is called via _mesa_error().
1525 */
1526 void
1527 _mesa_record_error(GLcontext *ctx, GLenum error)
1528 {
1529 if (!ctx)
1530 return;
1531
1532 if (ctx->ErrorValue == GL_NO_ERROR) {
1533 ctx->ErrorValue = error;
1534 }
1535
1536 /* Call device driver's error handler, if any. This is used on the Mac. */
1537 if (ctx->Driver.Error) {
1538 ctx->Driver.Error(ctx);
1539 }
1540 }
1541
1542
1543 /**
1544 * Flush commands and wait for completion.
1545 */
1546 void
1547 _mesa_finish(GLcontext *ctx)
1548 {
1549 FLUSH_CURRENT( ctx, 0 );
1550 if (ctx->Driver.Finish) {
1551 ctx->Driver.Finish(ctx);
1552 }
1553 }
1554
1555
1556 /**
1557 * Flush commands.
1558 */
1559 void
1560 _mesa_flush(GLcontext *ctx)
1561 {
1562 FLUSH_CURRENT( ctx, 0 );
1563 if (ctx->Driver.Flush) {
1564 ctx->Driver.Flush(ctx);
1565 }
1566 }
1567
1568
1569
1570 /**
1571 * Execute glFinish().
1572 *
1573 * Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the
1574 * dd_function_table::Finish driver callback, if not NULL.
1575 */
1576 void GLAPIENTRY
1577 _mesa_Finish(void)
1578 {
1579 GET_CURRENT_CONTEXT(ctx);
1580 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1581 _mesa_finish(ctx);
1582 }
1583
1584
1585 /**
1586 * Execute glFlush().
1587 *
1588 * Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the
1589 * dd_function_table::Flush driver callback, if not NULL.
1590 */
1591 void GLAPIENTRY
1592 _mesa_Flush(void)
1593 {
1594 GET_CURRENT_CONTEXT(ctx);
1595 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1596 _mesa_flush(ctx);
1597 }
1598
1599
1600 /**
1601 * Set mvp_with_dp4 flag. If a driver has a preference for DP4 over
1602 * MUL/MAD, or vice versa, call this function to register that.
1603 * Otherwise we default to MUL/MAD.
1604 */
1605 void
1606 _mesa_set_mvp_with_dp4( GLcontext *ctx,
1607 GLboolean flag )
1608 {
1609 ctx->mvp_with_dp4 = flag;
1610 }
1611
1612
1613
1614 /**
1615 * Prior to drawing anything with glBegin, glDrawArrays, etc. this function
1616 * is called to see if it's valid to render. This involves checking that
1617 * the current shader is valid and the framebuffer is complete.
1618 * If an error is detected it'll be recorded here.
1619 * \return GL_TRUE if OK to render, GL_FALSE if not
1620 */
1621 GLboolean
1622 _mesa_valid_to_render(GLcontext *ctx, const char *where)
1623 {
1624 /* This depends on having up to date derived state (shaders) */
1625 if (ctx->NewState)
1626 _mesa_update_state(ctx);
1627
1628 if (ctx->Shader.CurrentProgram) {
1629 /* using shaders */
1630 if (!ctx->Shader.CurrentProgram->LinkStatus) {
1631 _mesa_error(ctx, GL_INVALID_OPERATION,
1632 "%s(shader not linked), where");
1633 return GL_FALSE;
1634 }
1635 #if 0 /* not normally enabled */
1636 {
1637 char errMsg[100];
1638 if (!_mesa_validate_shader_program(ctx, ctx->Shader.CurrentProgram,
1639 errMsg)) {
1640 _mesa_warning(ctx, "Shader program %u is invalid: %s",
1641 ctx->Shader.CurrentProgram->Name, errMsg);
1642 }
1643 }
1644 #endif
1645 }
1646 else {
1647 if (ctx->VertexProgram.Enabled && !ctx->VertexProgram._Enabled) {
1648 _mesa_error(ctx, GL_INVALID_OPERATION,
1649 "%s(vertex program not valid)", where);
1650 return GL_FALSE;
1651 }
1652 if (ctx->FragmentProgram.Enabled && !ctx->FragmentProgram._Enabled) {
1653 _mesa_error(ctx, GL_INVALID_OPERATION,
1654 "%s(fragment program not valid)", where);
1655 return GL_FALSE;
1656 }
1657 }
1658
1659 if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
1660 _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
1661 "%s(incomplete framebuffer)", where);
1662 return GL_FALSE;
1663 }
1664
1665 #ifdef DEBUG
1666 if (ctx->Shader.Flags & GLSL_LOG) {
1667 struct gl_shader_program *shProg = ctx->Shader.CurrentProgram;
1668 if (shProg) {
1669 if (!shProg->_Used) {
1670 /* This is the first time this shader is being used.
1671 * Append shader's constants/uniforms to log file.
1672 */
1673 GLuint i;
1674 for (i = 0; i < shProg->NumShaders; i++) {
1675 struct gl_shader *sh = shProg->Shaders[i];
1676 if (sh->Type == GL_VERTEX_SHADER) {
1677 _mesa_append_uniforms_to_file(sh,
1678 &shProg->VertexProgram->Base);
1679 }
1680 else if (sh->Type == GL_FRAGMENT_SHADER) {
1681 _mesa_append_uniforms_to_file(sh,
1682 &shProg->FragmentProgram->Base);
1683 }
1684 }
1685 shProg->_Used = GL_TRUE;
1686 }
1687 }
1688 }
1689 #endif
1690
1691 return GL_TRUE;
1692 }
1693
1694
1695 /*@}*/