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