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