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