Merge remote branch 'origin/master' into pipe-video
[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 "context.h"
90 #include "cpuinfo.h"
91 #include "debug.h"
92 #include "depth.h"
93 #include "dlist.h"
94 #include "eval.h"
95 #include "extensions.h"
96 #include "fbobject.h"
97 #include "feedback.h"
98 #include "fog.h"
99 #include "framebuffer.h"
100 #include "hint.h"
101 #include "hash.h"
102 #include "light.h"
103 #include "lines.h"
104 #include "macros.h"
105 #include "matrix.h"
106 #include "multisample.h"
107 #include "pixel.h"
108 #include "pixelstore.h"
109 #include "points.h"
110 #include "polygon.h"
111 #include "queryobj.h"
112 #include "syncobj.h"
113 #include "rastpos.h"
114 #include "remap.h"
115 #include "scissor.h"
116 #include "shared.h"
117 #include "shaderobj.h"
118 #include "simple_list.h"
119 #include "state.h"
120 #include "stencil.h"
121 #include "texcompress_s3tc.h"
122 #include "texstate.h"
123 #include "transformfeedback.h"
124 #include "mtypes.h"
125 #include "varray.h"
126 #include "version.h"
127 #include "viewport.h"
128 #include "vtxfmt.h"
129 #include "program/program.h"
130 #include "program/prog_print.h"
131 #if _HAVE_FULL_GL
132 #include "math/m_matrix.h"
133 #endif
134 #include "main/dispatch.h" /* for _gloffset_COUNT */
135
136 #ifdef USE_SPARC_ASM
137 #include "sparc/sparc.h"
138 #endif
139
140 #include "glsl_parser_extras.h"
141 #include <stdbool.h>
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(struct gl_context *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 struct gl_config 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 struct gl_config 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 struct gl_config *
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 struct gl_config *vis = (struct gl_config *) calloc(1, sizeof(struct gl_config));
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 * struct gl_config object with the given parameters. If the caller needs
240 * to set additional fields, he should just probably init the whole struct gl_config
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( struct gl_config *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->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( struct gl_config *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 = BUFFER_FRONT_LEFT;
343 gl_face_index fi = FACE_POS_X;
344 gl_frag_attrib fa = FRAG_ATTRIB_WPOS;
345 gl_frag_result fr = FRAG_RESULT_DEPTH;
346 gl_texture_index ti = TEXTURE_2D_ARRAY_INDEX;
347 gl_vert_attrib va = VERT_ATTRIB_POS;
348 gl_vert_result vr = VERT_RESULT_HPOS;
349 gl_geom_attrib ga = GEOM_ATTRIB_POSITION;
350 gl_geom_result gr = GEOM_RESULT_POS;
351
352 (void) bi;
353 (void) fi;
354 (void) fa;
355 (void) fr;
356 (void) ti;
357 (void) va;
358 (void) vr;
359 (void) ga;
360 (void) gr;
361 }
362
363
364 /**
365 * One-time initialization mutex lock.
366 *
367 * \sa Used by one_time_init().
368 */
369 _glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
370
371 /**
372 * Calls all the various one-time-init functions in Mesa.
373 *
374 * While holding a global mutex lock, calls several initialization functions,
375 * and sets the glapi callbacks if the \c MESA_DEBUG environment variable is
376 * defined.
377 *
378 * \sa _math_init().
379 */
380 static void
381 one_time_init( struct gl_context *ctx )
382 {
383 static GLbitfield api_init_mask = 0x0;
384
385 _glthread_LOCK_MUTEX(OneTimeLock);
386
387 /* truly one-time init */
388 if (!api_init_mask) {
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 _mesa_init_sqrt_table();
402
403 /* context dependence is never a one-time thing... */
404 _mesa_init_get_hash(ctx);
405
406 for (i = 0; i < 256; i++) {
407 _mesa_ubyte_to_float_color_tab[i] = (float) i / 255.0F;
408 }
409
410 #if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
411 _mesa_debug(ctx, "Mesa %s DEBUG build %s %s\n",
412 MESA_VERSION_STRING, __DATE__, __TIME__);
413 #endif
414 }
415
416 /* per-API one-time init */
417 if (!(api_init_mask & (1 << ctx->API))) {
418 /*
419 * This is fine as ES does not use the remap table, but it may not be
420 * future-proof. We cannot always initialize the remap table because
421 * when an app is linked to libGLES*, there are not enough dynamic
422 * entries.
423 */
424 if (ctx->API == API_OPENGL)
425 _mesa_init_remap_table();
426 }
427
428 api_init_mask |= 1 << ctx->API;
429
430 _glthread_UNLOCK_MUTEX(OneTimeLock);
431
432 /* Hopefully atexit() is widely available. If not, we may need some
433 * #ifdef tests here.
434 */
435 atexit(_mesa_destroy_shader_compiler);
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(struct gl_context *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(struct gl_context *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.MaxClipPlanes = MAX_CLIP_PLANES;
557 ctx->Const.MaxLights = MAX_LIGHTS;
558 ctx->Const.MaxShininess = 128.0;
559 ctx->Const.MaxSpotExponent = 128.0;
560 ctx->Const.MaxViewportWidth = MAX_WIDTH;
561 ctx->Const.MaxViewportHeight = MAX_HEIGHT;
562 #if FEATURE_ARB_vertex_program
563 init_program_limits(GL_VERTEX_PROGRAM_ARB, &ctx->Const.VertexProgram);
564 #endif
565 #if FEATURE_ARB_fragment_program
566 init_program_limits(GL_FRAGMENT_PROGRAM_ARB, &ctx->Const.FragmentProgram);
567 #endif
568 #if FEATURE_ARB_geometry_shader4
569 init_program_limits(MESA_GEOMETRY_PROGRAM, &ctx->Const.GeometryProgram);
570 #endif
571 ctx->Const.MaxProgramMatrices = MAX_PROGRAM_MATRICES;
572 ctx->Const.MaxProgramMatrixStackDepth = MAX_PROGRAM_MATRIX_STACK_DEPTH;
573
574 /* CheckArrayBounds is overriden by drivers/x11 for X server */
575 ctx->Const.CheckArrayBounds = GL_FALSE;
576
577 /* GL_ARB_draw_buffers */
578 ctx->Const.MaxDrawBuffers = MAX_DRAW_BUFFERS;
579
580 #if FEATURE_EXT_framebuffer_object
581 ctx->Const.MaxColorAttachments = MAX_COLOR_ATTACHMENTS;
582 ctx->Const.MaxRenderbufferSize = MAX_WIDTH;
583 #endif
584
585 #if FEATURE_ARB_vertex_shader
586 ctx->Const.MaxVertexTextureImageUnits = MAX_VERTEX_TEXTURE_IMAGE_UNITS;
587 ctx->Const.MaxCombinedTextureImageUnits = MAX_COMBINED_TEXTURE_IMAGE_UNITS;
588 ctx->Const.MaxVarying = MAX_VARYING;
589 #endif
590
591 /* Shading language version */
592 if (ctx->API == API_OPENGL) {
593 ctx->Const.GLSLVersion = 120;
594 }
595 else if (ctx->API == API_OPENGLES2) {
596 ctx->Const.GLSLVersion = 100;
597 }
598 else if (ctx->API == API_OPENGLES) {
599 ctx->Const.GLSLVersion = 0; /* GLSL not supported */
600 }
601
602 /* GL_ARB_framebuffer_object */
603 ctx->Const.MaxSamples = 0;
604
605 /* GL_ARB_sync */
606 ctx->Const.MaxServerWaitTimeout = (GLuint64) ~0;
607
608 /* GL_ATI_envmap_bumpmap */
609 ctx->Const.SupportedBumpUnits = SUPPORTED_ATI_BUMP_UNITS;
610
611 /* GL_EXT_provoking_vertex */
612 ctx->Const.QuadsFollowProvokingVertexConvention = GL_TRUE;
613
614 /* GL_EXT_transform_feedback */
615 ctx->Const.MaxTransformFeedbackSeparateAttribs = MAX_FEEDBACK_ATTRIBS;
616 ctx->Const.MaxTransformFeedbackSeparateComponents = 4 * MAX_FEEDBACK_ATTRIBS;
617 ctx->Const.MaxTransformFeedbackInterleavedComponents = 4 * MAX_FEEDBACK_ATTRIBS;
618
619 /* GL 3.2: hard-coded for now: */
620 ctx->Const.ProfileMask = GL_CONTEXT_COMPATIBILITY_PROFILE_BIT;
621
622 /** GL_EXT_gpu_shader4 */
623 ctx->Const.MinProgramTexelOffset = -8;
624 ctx->Const.MaxProgramTexelOffset = 7;
625 }
626
627
628 /**
629 * Do some sanity checks on the limits/constants for the given context.
630 * Only called the first time a context is bound.
631 */
632 static void
633 check_context_limits(struct gl_context *ctx)
634 {
635 /* check that we don't exceed the size of various bitfields */
636 assert(VERT_RESULT_MAX <=
637 (8 * sizeof(ctx->VertexProgram._Current->Base.OutputsWritten)));
638 assert(FRAG_ATTRIB_MAX <=
639 (8 * sizeof(ctx->FragmentProgram._Current->Base.InputsRead)));
640
641 assert(MAX_COMBINED_TEXTURE_IMAGE_UNITS <= 8 * sizeof(GLbitfield));
642
643 /* shader-related checks */
644 assert(ctx->Const.FragmentProgram.MaxLocalParams <= MAX_PROGRAM_LOCAL_PARAMS);
645 assert(ctx->Const.VertexProgram.MaxLocalParams <= MAX_PROGRAM_LOCAL_PARAMS);
646
647 assert(MAX_NV_FRAGMENT_PROGRAM_TEMPS <= MAX_PROGRAM_TEMPS);
648 assert(MAX_NV_VERTEX_PROGRAM_TEMPS <= MAX_PROGRAM_TEMPS);
649 assert(MAX_NV_VERTEX_PROGRAM_INPUTS <= VERT_ATTRIB_MAX);
650 assert(MAX_NV_VERTEX_PROGRAM_OUTPUTS <= VERT_RESULT_MAX);
651
652 /* Texture unit checks */
653 assert(ctx->Const.MaxTextureImageUnits > 0);
654 assert(ctx->Const.MaxTextureImageUnits <= MAX_TEXTURE_IMAGE_UNITS);
655 assert(ctx->Const.MaxTextureCoordUnits > 0);
656 assert(ctx->Const.MaxTextureCoordUnits <= MAX_TEXTURE_COORD_UNITS);
657 assert(ctx->Const.MaxTextureUnits > 0);
658 assert(ctx->Const.MaxTextureUnits <= MAX_TEXTURE_IMAGE_UNITS);
659 assert(ctx->Const.MaxTextureUnits <= MAX_TEXTURE_COORD_UNITS);
660 assert(ctx->Const.MaxTextureUnits == MIN2(ctx->Const.MaxTextureImageUnits,
661 ctx->Const.MaxTextureCoordUnits));
662 assert(ctx->Const.MaxCombinedTextureImageUnits > 0);
663 assert(ctx->Const.MaxCombinedTextureImageUnits <= MAX_COMBINED_TEXTURE_IMAGE_UNITS);
664 assert(ctx->Const.MaxTextureCoordUnits <= MAX_COMBINED_TEXTURE_IMAGE_UNITS);
665 /* number of coord units cannot be greater than number of image units */
666 assert(ctx->Const.MaxTextureCoordUnits <= ctx->Const.MaxTextureImageUnits);
667
668
669 /* Texture size checks */
670 assert(ctx->Const.MaxTextureLevels <= MAX_TEXTURE_LEVELS);
671 assert(ctx->Const.Max3DTextureLevels <= MAX_3D_TEXTURE_LEVELS);
672 assert(ctx->Const.MaxCubeTextureLevels <= MAX_CUBE_TEXTURE_LEVELS);
673 assert(ctx->Const.MaxTextureRectSize <= MAX_TEXTURE_RECT_SIZE);
674
675 /* make sure largest texture image is <= MAX_WIDTH in size */
676 assert((1 << (ctx->Const.MaxTextureLevels - 1)) <= MAX_WIDTH);
677 assert((1 << (ctx->Const.MaxCubeTextureLevels - 1)) <= MAX_WIDTH);
678 assert((1 << (ctx->Const.Max3DTextureLevels - 1)) <= MAX_WIDTH);
679
680 /* Texture level checks */
681 assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);
682 assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);
683
684 /* Max texture size should be <= max viewport size (render to texture) */
685 assert((1 << (MAX_TEXTURE_LEVELS - 1)) <= MAX_WIDTH);
686
687 assert(ctx->Const.MaxViewportWidth <= MAX_WIDTH);
688 assert(ctx->Const.MaxViewportHeight <= MAX_WIDTH);
689
690 assert(ctx->Const.MaxDrawBuffers <= MAX_DRAW_BUFFERS);
691
692 /* if this fails, add more enum values to gl_buffer_index */
693 assert(BUFFER_COLOR0 + MAX_DRAW_BUFFERS <= BUFFER_COUNT);
694
695 /* XXX probably add more tests */
696 }
697
698
699 /**
700 * Initialize the attribute groups in a GL context.
701 *
702 * \param ctx GL context.
703 *
704 * Initializes all the attributes, calling the respective <tt>init*</tt>
705 * functions for the more complex data structures.
706 */
707 static GLboolean
708 init_attrib_groups(struct gl_context *ctx)
709 {
710 assert(ctx);
711
712 /* Constants */
713 _mesa_init_constants( ctx );
714
715 /* Extensions */
716 _mesa_init_extensions( ctx );
717
718 /* Attribute Groups */
719 _mesa_init_accum( ctx );
720 _mesa_init_attrib( ctx );
721 _mesa_init_buffer_objects( ctx );
722 _mesa_init_color( ctx );
723 _mesa_init_current( ctx );
724 _mesa_init_depth( ctx );
725 _mesa_init_debug( ctx );
726 _mesa_init_display_list( ctx );
727 _mesa_init_eval( ctx );
728 _mesa_init_fbobjects( ctx );
729 _mesa_init_feedback( ctx );
730 _mesa_init_fog( ctx );
731 _mesa_init_hint( ctx );
732 _mesa_init_line( ctx );
733 _mesa_init_lighting( ctx );
734 _mesa_init_matrix( ctx );
735 _mesa_init_multisample( ctx );
736 _mesa_init_pixel( ctx );
737 _mesa_init_pixelstore( ctx );
738 _mesa_init_point( ctx );
739 _mesa_init_polygon( ctx );
740 _mesa_init_program( ctx );
741 _mesa_init_queryobj( ctx );
742 _mesa_init_sync( ctx );
743 _mesa_init_rastpos( ctx );
744 _mesa_init_scissor( ctx );
745 _mesa_init_shader_state( ctx );
746 _mesa_init_stencil( ctx );
747 _mesa_init_transform( ctx );
748 _mesa_init_transform_feedback( ctx );
749 _mesa_init_varray( ctx );
750 _mesa_init_viewport( ctx );
751
752 if (!_mesa_init_texture( ctx ))
753 return GL_FALSE;
754
755 _mesa_init_texture_s3tc( ctx );
756
757 /* Miscellaneous */
758 ctx->NewState = _NEW_ALL;
759 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
760 ctx->varying_vp_inputs = ~0;
761
762 return GL_TRUE;
763 }
764
765
766 /**
767 * Update default objects in a GL context with respect to shared state.
768 *
769 * \param ctx GL context.
770 *
771 * Removes references to old default objects, (texture objects, program
772 * objects, etc.) and changes to reference those from the current shared
773 * state.
774 */
775 static GLboolean
776 update_default_objects(struct gl_context *ctx)
777 {
778 assert(ctx);
779
780 _mesa_update_default_objects_program(ctx);
781 _mesa_update_default_objects_texture(ctx);
782 _mesa_update_default_objects_buffer_objects(ctx);
783
784 return GL_TRUE;
785 }
786
787
788 /**
789 * This is the default function we plug into all dispatch table slots
790 * This helps prevents a segfault when someone calls a GL function without
791 * first checking if the extension's supported.
792 */
793 static int
794 generic_nop(void)
795 {
796 _mesa_warning(NULL, "User called no-op dispatch function (an unsupported extension function?)");
797 return 0;
798 }
799
800
801 /**
802 * Allocate and initialize a new dispatch table.
803 */
804 struct _glapi_table *
805 _mesa_alloc_dispatch_table(int size)
806 {
807 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
808 * In practice, this'll be the same for stand-alone Mesa. But for DRI
809 * Mesa we do this to accomodate different versions of libGL and various
810 * DRI drivers.
811 */
812 GLint numEntries = MAX2(_glapi_get_dispatch_table_size(), _gloffset_COUNT);
813 struct _glapi_table *table;
814
815 /* should never happen, but just in case */
816 numEntries = MAX2(numEntries, size);
817
818 table = (struct _glapi_table *) malloc(numEntries * sizeof(_glapi_proc));
819 if (table) {
820 _glapi_proc *entry = (_glapi_proc *) table;
821 GLint i;
822 for (i = 0; i < numEntries; i++) {
823 entry[i] = (_glapi_proc) generic_nop;
824 }
825 }
826 return table;
827 }
828
829
830 /**
831 * Initialize a struct gl_context struct (rendering context).
832 *
833 * This includes allocating all the other structs and arrays which hang off of
834 * the context by pointers.
835 * Note that the driver needs to pass in its dd_function_table here since
836 * we need to at least call driverFunctions->NewTextureObject to create the
837 * default texture objects.
838 *
839 * Called by _mesa_create_context().
840 *
841 * Performs the imports and exports callback tables initialization, and
842 * miscellaneous one-time initializations. If no shared context is supplied one
843 * is allocated, and increase its reference count. Setups the GL API dispatch
844 * tables. Initialize the TNL module. Sets the maximum Z buffer depth.
845 * Finally queries the \c MESA_DEBUG and \c MESA_VERBOSE environment variables
846 * for debug flags.
847 *
848 * \param ctx the context to initialize
849 * \param api the GL API type to create the context for
850 * \param visual describes the visual attributes for this context
851 * \param share_list points to context to share textures, display lists,
852 * etc with, or NULL
853 * \param driverFunctions table of device driver functions for this context
854 * to use
855 * \param driverContext pointer to driver-specific context data
856 */
857 GLboolean
858 _mesa_initialize_context_for_api(struct gl_context *ctx,
859 gl_api api,
860 const struct gl_config *visual,
861 struct gl_context *share_list,
862 const struct dd_function_table *driverFunctions,
863 void *driverContext)
864 {
865 struct gl_shared_state *shared;
866 int i;
867
868 /*ASSERT(driverContext);*/
869 assert(driverFunctions->NewTextureObject);
870 assert(driverFunctions->FreeTexImageData);
871
872 ctx->API = api;
873 ctx->Visual = *visual;
874 ctx->DrawBuffer = NULL;
875 ctx->ReadBuffer = NULL;
876 ctx->WinSysDrawBuffer = NULL;
877 ctx->WinSysReadBuffer = NULL;
878
879 /* misc one-time initializations */
880 one_time_init(ctx);
881
882 /* Plug in driver functions and context pointer here.
883 * This is important because when we call alloc_shared_state() below
884 * we'll call ctx->Driver.NewTextureObject() to create the default
885 * textures.
886 */
887 ctx->Driver = *driverFunctions;
888 ctx->DriverCtx = driverContext;
889
890 if (share_list) {
891 /* share state with another context */
892 shared = share_list->Shared;
893 }
894 else {
895 /* allocate new, unshared state */
896 shared = _mesa_alloc_shared_state(ctx);
897 if (!shared)
898 return GL_FALSE;
899 }
900
901 _glthread_LOCK_MUTEX(shared->Mutex);
902 ctx->Shared = shared;
903 shared->RefCount++;
904 _glthread_UNLOCK_MUTEX(shared->Mutex);
905
906 if (!init_attrib_groups( ctx )) {
907 _mesa_release_shared_state(ctx, ctx->Shared);
908 return GL_FALSE;
909 }
910
911 #if FEATURE_dispatch
912 /* setup the API dispatch tables */
913 switch (ctx->API) {
914 #if FEATURE_GL
915 case API_OPENGL:
916 ctx->Exec = _mesa_create_exec_table();
917 break;
918 #endif
919 #if FEATURE_ES1
920 case API_OPENGLES:
921 ctx->Exec = _mesa_create_exec_table_es1();
922 break;
923 #endif
924 #if FEATURE_ES2
925 case API_OPENGLES2:
926 ctx->Exec = _mesa_create_exec_table_es2();
927 break;
928 #endif
929 default:
930 _mesa_problem(ctx, "unknown or unsupported API");
931 break;
932 }
933
934 if (!ctx->Exec) {
935 _mesa_release_shared_state(ctx, ctx->Shared);
936 return GL_FALSE;
937 }
938 #endif
939 ctx->CurrentDispatch = ctx->Exec;
940
941 ctx->FragmentProgram._MaintainTexEnvProgram
942 = (_mesa_getenv("MESA_TEX_PROG") != NULL);
943
944 ctx->VertexProgram._MaintainTnlProgram
945 = (_mesa_getenv("MESA_TNL_PROG") != NULL);
946 if (ctx->VertexProgram._MaintainTnlProgram) {
947 /* this is required... */
948 ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
949 }
950
951 switch (ctx->API) {
952 case API_OPENGL:
953 #if FEATURE_dlist
954 ctx->Save = _mesa_create_save_table();
955 if (!ctx->Save) {
956 _mesa_release_shared_state(ctx, ctx->Shared);
957 free(ctx->Exec);
958 return GL_FALSE;
959 }
960
961 _mesa_install_save_vtxfmt( ctx, &ctx->ListState.ListVtxfmt );
962 #endif
963 break;
964 case API_OPENGLES:
965 /**
966 * GL_OES_texture_cube_map says
967 * "Initially all texture generation modes are set to REFLECTION_MAP_OES"
968 */
969 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
970 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i];
971 texUnit->GenS.Mode = GL_REFLECTION_MAP_NV;
972 texUnit->GenT.Mode = GL_REFLECTION_MAP_NV;
973 texUnit->GenR.Mode = GL_REFLECTION_MAP_NV;
974 texUnit->GenS._ModeBit = TEXGEN_REFLECTION_MAP_NV;
975 texUnit->GenT._ModeBit = TEXGEN_REFLECTION_MAP_NV;
976 texUnit->GenR._ModeBit = TEXGEN_REFLECTION_MAP_NV;
977 }
978 break;
979 case API_OPENGLES2:
980 ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
981 ctx->VertexProgram._MaintainTnlProgram = GL_TRUE;
982 ctx->Point.PointSprite = GL_TRUE; /* always on for ES 2.x */
983 break;
984 }
985
986 ctx->FirstTimeCurrent = GL_TRUE;
987
988 return GL_TRUE;
989 }
990
991 GLboolean
992 _mesa_initialize_context(struct gl_context *ctx,
993 const struct gl_config *visual,
994 struct gl_context *share_list,
995 const struct dd_function_table *driverFunctions,
996 void *driverContext)
997 {
998 return _mesa_initialize_context_for_api(ctx,
999 API_OPENGL,
1000 visual,
1001 share_list,
1002 driverFunctions,
1003 driverContext);
1004 }
1005
1006 /**
1007 * Allocate and initialize a struct gl_context structure.
1008 * Note that the driver needs to pass in its dd_function_table here since
1009 * we need to at least call driverFunctions->NewTextureObject to initialize
1010 * the rendering context.
1011 *
1012 * \param api the GL API type to create the context for
1013 * \param visual a struct gl_config pointer (we copy the struct contents)
1014 * \param share_list another context to share display lists with or NULL
1015 * \param driverFunctions points to the dd_function_table into which the
1016 * driver has plugged in all its special functions.
1017 * \param driverContext points to the device driver's private context state
1018 *
1019 * \return pointer to a new __struct gl_contextRec or NULL if error.
1020 */
1021 struct gl_context *
1022 _mesa_create_context_for_api(gl_api api,
1023 const struct gl_config *visual,
1024 struct gl_context *share_list,
1025 const struct dd_function_table *driverFunctions,
1026 void *driverContext)
1027 {
1028 struct gl_context *ctx;
1029
1030 ASSERT(visual);
1031 /*ASSERT(driverContext);*/
1032
1033 ctx = (struct gl_context *) calloc(1, sizeof(struct gl_context));
1034 if (!ctx)
1035 return NULL;
1036
1037 if (_mesa_initialize_context_for_api(ctx, api, visual, share_list,
1038 driverFunctions, driverContext)) {
1039 return ctx;
1040 }
1041 else {
1042 free(ctx);
1043 return NULL;
1044 }
1045 }
1046
1047 struct gl_context *
1048 _mesa_create_context(const struct gl_config *visual,
1049 struct gl_context *share_list,
1050 const struct dd_function_table *driverFunctions,
1051 void *driverContext)
1052 {
1053 return _mesa_create_context_for_api(API_OPENGL, visual,
1054 share_list,
1055 driverFunctions,
1056 driverContext);
1057 }
1058
1059 /**
1060 * Free the data associated with the given context.
1061 *
1062 * But doesn't free the struct gl_context struct itself.
1063 *
1064 * \sa _mesa_initialize_context() and init_attrib_groups().
1065 */
1066 void
1067 _mesa_free_context_data( struct gl_context *ctx )
1068 {
1069 if (!_mesa_get_current_context()){
1070 /* No current context, but we may need one in order to delete
1071 * texture objs, etc. So temporarily bind the context now.
1072 */
1073 _mesa_make_current(ctx, NULL, NULL);
1074 }
1075
1076 /* unreference WinSysDraw/Read buffers */
1077 _mesa_reference_framebuffer(&ctx->WinSysDrawBuffer, NULL);
1078 _mesa_reference_framebuffer(&ctx->WinSysReadBuffer, NULL);
1079 _mesa_reference_framebuffer(&ctx->DrawBuffer, NULL);
1080 _mesa_reference_framebuffer(&ctx->ReadBuffer, NULL);
1081
1082 _mesa_reference_vertprog(ctx, &ctx->VertexProgram.Current, NULL);
1083 _mesa_reference_vertprog(ctx, &ctx->VertexProgram._Current, NULL);
1084 _mesa_reference_vertprog(ctx, &ctx->VertexProgram._TnlProgram, NULL);
1085
1086 _mesa_reference_fragprog(ctx, &ctx->FragmentProgram.Current, NULL);
1087 _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current, NULL);
1088 _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._TexEnvProgram, NULL);
1089
1090 _mesa_free_attrib_data(ctx);
1091 _mesa_free_buffer_objects(ctx);
1092 _mesa_free_lighting_data( ctx );
1093 _mesa_free_eval_data( ctx );
1094 _mesa_free_texture_data( ctx );
1095 _mesa_free_matrix_data( ctx );
1096 _mesa_free_viewport_data( ctx );
1097 _mesa_free_program_data(ctx);
1098 _mesa_free_shader_state(ctx);
1099 _mesa_free_queryobj_data(ctx);
1100 _mesa_free_sync_data(ctx);
1101 _mesa_free_varray_data(ctx);
1102 _mesa_free_transform_feedback(ctx);
1103
1104 _mesa_delete_array_object(ctx, ctx->Array.DefaultArrayObj);
1105
1106 #if FEATURE_ARB_pixel_buffer_object
1107 _mesa_reference_buffer_object(ctx, &ctx->Pack.BufferObj, NULL);
1108 _mesa_reference_buffer_object(ctx, &ctx->Unpack.BufferObj, NULL);
1109 _mesa_reference_buffer_object(ctx, &ctx->DefaultPacking.BufferObj, NULL);
1110 #endif
1111
1112 #if FEATURE_ARB_vertex_buffer_object
1113 _mesa_reference_buffer_object(ctx, &ctx->Array.ArrayBufferObj, NULL);
1114 _mesa_reference_buffer_object(ctx, &ctx->Array.ElementArrayBufferObj, NULL);
1115 #endif
1116
1117 /* free dispatch tables */
1118 free(ctx->Exec);
1119 free(ctx->Save);
1120
1121 /* Shared context state (display lists, textures, etc) */
1122 _mesa_release_shared_state( ctx, ctx->Shared );
1123
1124 /* needs to be after freeing shared state */
1125 _mesa_free_display_list_data(ctx);
1126
1127 if (ctx->Extensions.String)
1128 free((void *) ctx->Extensions.String);
1129
1130 if (ctx->VersionString)
1131 free(ctx->VersionString);
1132
1133 /* unbind the context if it's currently bound */
1134 if (ctx == _mesa_get_current_context()) {
1135 _mesa_make_current(NULL, NULL, NULL);
1136 }
1137 }
1138
1139
1140 /**
1141 * Destroy a struct gl_context structure.
1142 *
1143 * \param ctx GL context.
1144 *
1145 * Calls _mesa_free_context_data() and frees the struct gl_context structure itself.
1146 */
1147 void
1148 _mesa_destroy_context( struct gl_context *ctx )
1149 {
1150 if (ctx) {
1151 _mesa_free_context_data(ctx);
1152 free( (void *) ctx );
1153 }
1154 }
1155
1156
1157 #if _HAVE_FULL_GL
1158 /**
1159 * Copy attribute groups from one context to another.
1160 *
1161 * \param src source context
1162 * \param dst destination context
1163 * \param mask bitwise OR of GL_*_BIT flags
1164 *
1165 * According to the bits specified in \p mask, copies the corresponding
1166 * attributes from \p src into \p dst. For many of the attributes a simple \c
1167 * memcpy is not enough due to the existence of internal pointers in their data
1168 * structures.
1169 */
1170 void
1171 _mesa_copy_context( const struct gl_context *src, struct gl_context *dst, GLuint mask )
1172 {
1173 if (mask & GL_ACCUM_BUFFER_BIT) {
1174 /* OK to memcpy */
1175 dst->Accum = src->Accum;
1176 }
1177 if (mask & GL_COLOR_BUFFER_BIT) {
1178 /* OK to memcpy */
1179 dst->Color = src->Color;
1180 }
1181 if (mask & GL_CURRENT_BIT) {
1182 /* OK to memcpy */
1183 dst->Current = src->Current;
1184 }
1185 if (mask & GL_DEPTH_BUFFER_BIT) {
1186 /* OK to memcpy */
1187 dst->Depth = src->Depth;
1188 }
1189 if (mask & GL_ENABLE_BIT) {
1190 /* no op */
1191 }
1192 if (mask & GL_EVAL_BIT) {
1193 /* OK to memcpy */
1194 dst->Eval = src->Eval;
1195 }
1196 if (mask & GL_FOG_BIT) {
1197 /* OK to memcpy */
1198 dst->Fog = src->Fog;
1199 }
1200 if (mask & GL_HINT_BIT) {
1201 /* OK to memcpy */
1202 dst->Hint = src->Hint;
1203 }
1204 if (mask & GL_LIGHTING_BIT) {
1205 GLuint i;
1206 /* begin with memcpy */
1207 dst->Light = src->Light;
1208 /* fixup linked lists to prevent pointer insanity */
1209 make_empty_list( &(dst->Light.EnabledList) );
1210 for (i = 0; i < MAX_LIGHTS; i++) {
1211 if (dst->Light.Light[i].Enabled) {
1212 insert_at_tail(&(dst->Light.EnabledList), &(dst->Light.Light[i]));
1213 }
1214 }
1215 }
1216 if (mask & GL_LINE_BIT) {
1217 /* OK to memcpy */
1218 dst->Line = src->Line;
1219 }
1220 if (mask & GL_LIST_BIT) {
1221 /* OK to memcpy */
1222 dst->List = src->List;
1223 }
1224 if (mask & GL_PIXEL_MODE_BIT) {
1225 /* OK to memcpy */
1226 dst->Pixel = src->Pixel;
1227 }
1228 if (mask & GL_POINT_BIT) {
1229 /* OK to memcpy */
1230 dst->Point = src->Point;
1231 }
1232 if (mask & GL_POLYGON_BIT) {
1233 /* OK to memcpy */
1234 dst->Polygon = src->Polygon;
1235 }
1236 if (mask & GL_POLYGON_STIPPLE_BIT) {
1237 /* Use loop instead of memcpy due to problem with Portland Group's
1238 * C compiler. Reported by John Stone.
1239 */
1240 GLuint i;
1241 for (i = 0; i < 32; i++) {
1242 dst->PolygonStipple[i] = src->PolygonStipple[i];
1243 }
1244 }
1245 if (mask & GL_SCISSOR_BIT) {
1246 /* OK to memcpy */
1247 dst->Scissor = src->Scissor;
1248 }
1249 if (mask & GL_STENCIL_BUFFER_BIT) {
1250 /* OK to memcpy */
1251 dst->Stencil = src->Stencil;
1252 }
1253 if (mask & GL_TEXTURE_BIT) {
1254 /* Cannot memcpy because of pointers */
1255 _mesa_copy_texture_state(src, dst);
1256 }
1257 if (mask & GL_TRANSFORM_BIT) {
1258 /* OK to memcpy */
1259 dst->Transform = src->Transform;
1260 }
1261 if (mask & GL_VIEWPORT_BIT) {
1262 /* Cannot use memcpy, because of pointers in GLmatrix _WindowMap */
1263 dst->Viewport.X = src->Viewport.X;
1264 dst->Viewport.Y = src->Viewport.Y;
1265 dst->Viewport.Width = src->Viewport.Width;
1266 dst->Viewport.Height = src->Viewport.Height;
1267 dst->Viewport.Near = src->Viewport.Near;
1268 dst->Viewport.Far = src->Viewport.Far;
1269 _math_matrix_copy(&dst->Viewport._WindowMap, &src->Viewport._WindowMap);
1270 }
1271
1272 /* XXX FIXME: Call callbacks?
1273 */
1274 dst->NewState = _NEW_ALL;
1275 }
1276 #endif
1277
1278
1279 /**
1280 * Check if the given context can render into the given framebuffer
1281 * by checking visual attributes.
1282 *
1283 * Most of these tests could go away because Mesa is now pretty flexible
1284 * in terms of mixing rendering contexts with framebuffers. As long
1285 * as RGB vs. CI mode agree, we're probably good.
1286 *
1287 * \return GL_TRUE if compatible, GL_FALSE otherwise.
1288 */
1289 static GLboolean
1290 check_compatible(const struct gl_context *ctx, const struct gl_framebuffer *buffer)
1291 {
1292 const struct gl_config *ctxvis = &ctx->Visual;
1293 const struct gl_config *bufvis = &buffer->Visual;
1294
1295 if (buffer == _mesa_get_incomplete_framebuffer())
1296 return GL_TRUE;
1297
1298 #if 0
1299 /* disabling this fixes the fgl_glxgears pbuffer demo */
1300 if (ctxvis->doubleBufferMode && !bufvis->doubleBufferMode)
1301 return GL_FALSE;
1302 #endif
1303 if (ctxvis->stereoMode && !bufvis->stereoMode)
1304 return GL_FALSE;
1305 if (ctxvis->haveAccumBuffer && !bufvis->haveAccumBuffer)
1306 return GL_FALSE;
1307 if (ctxvis->haveDepthBuffer && !bufvis->haveDepthBuffer)
1308 return GL_FALSE;
1309 if (ctxvis->haveStencilBuffer && !bufvis->haveStencilBuffer)
1310 return GL_FALSE;
1311 if (ctxvis->redMask && ctxvis->redMask != bufvis->redMask)
1312 return GL_FALSE;
1313 if (ctxvis->greenMask && ctxvis->greenMask != bufvis->greenMask)
1314 return GL_FALSE;
1315 if (ctxvis->blueMask && ctxvis->blueMask != bufvis->blueMask)
1316 return GL_FALSE;
1317 #if 0
1318 /* disabled (see bug 11161) */
1319 if (ctxvis->depthBits && ctxvis->depthBits != bufvis->depthBits)
1320 return GL_FALSE;
1321 #endif
1322 if (ctxvis->stencilBits && ctxvis->stencilBits != bufvis->stencilBits)
1323 return GL_FALSE;
1324
1325 return GL_TRUE;
1326 }
1327
1328
1329 /**
1330 * Do one-time initialization for the given framebuffer. Specifically,
1331 * ask the driver for the window's current size and update the framebuffer
1332 * object to match.
1333 * Really, the device driver should totally take care of this.
1334 */
1335 static void
1336 initialize_framebuffer_size(struct gl_context *ctx, struct gl_framebuffer *fb)
1337 {
1338 GLuint width, height;
1339 if (ctx->Driver.GetBufferSize) {
1340 ctx->Driver.GetBufferSize(fb, &width, &height);
1341 if (ctx->Driver.ResizeBuffers)
1342 ctx->Driver.ResizeBuffers(ctx, fb, width, height);
1343 fb->Initialized = GL_TRUE;
1344 }
1345 }
1346
1347
1348 /**
1349 * Check if the viewport/scissor size has not yet been initialized.
1350 * Initialize the size if the given width and height are non-zero.
1351 */
1352 void
1353 _mesa_check_init_viewport(struct gl_context *ctx, GLuint width, GLuint height)
1354 {
1355 if (!ctx->ViewportInitialized && width > 0 && height > 0) {
1356 /* Note: set flag here, before calling _mesa_set_viewport(), to prevent
1357 * potential infinite recursion.
1358 */
1359 ctx->ViewportInitialized = GL_TRUE;
1360 _mesa_set_viewport(ctx, 0, 0, width, height);
1361 _mesa_set_scissor(ctx, 0, 0, width, height);
1362 }
1363 }
1364
1365
1366 /**
1367 * Bind the given context to the given drawBuffer and readBuffer and
1368 * make it the current context for the calling thread.
1369 * We'll render into the drawBuffer and read pixels from the
1370 * readBuffer (i.e. glRead/CopyPixels, glCopyTexImage, etc).
1371 *
1372 * We check that the context's and framebuffer's visuals are compatible
1373 * and return immediately if they're not.
1374 *
1375 * \param newCtx the new GL context. If NULL then there will be no current GL
1376 * context.
1377 * \param drawBuffer the drawing framebuffer
1378 * \param readBuffer the reading framebuffer
1379 */
1380 GLboolean
1381 _mesa_make_current( struct gl_context *newCtx, struct gl_framebuffer *drawBuffer,
1382 struct gl_framebuffer *readBuffer )
1383 {
1384 if (MESA_VERBOSE & VERBOSE_API)
1385 _mesa_debug(newCtx, "_mesa_make_current()\n");
1386
1387 /* Check that the context's and framebuffer's visuals are compatible.
1388 */
1389 if (newCtx && drawBuffer && newCtx->WinSysDrawBuffer != drawBuffer) {
1390 if (!check_compatible(newCtx, drawBuffer)) {
1391 _mesa_warning(newCtx,
1392 "MakeCurrent: incompatible visuals for context and drawbuffer");
1393 return GL_FALSE;
1394 }
1395 }
1396 if (newCtx && readBuffer && newCtx->WinSysReadBuffer != readBuffer) {
1397 if (!check_compatible(newCtx, readBuffer)) {
1398 _mesa_warning(newCtx,
1399 "MakeCurrent: incompatible visuals for context and readbuffer");
1400 return GL_FALSE;
1401 }
1402 }
1403
1404 /* We used to call _glapi_check_multithread() here. Now do it in drivers */
1405 _glapi_set_context((void *) newCtx);
1406 ASSERT(_mesa_get_current_context() == newCtx);
1407
1408 if (!newCtx) {
1409 _glapi_set_dispatch(NULL); /* none current */
1410 }
1411 else {
1412 _glapi_set_dispatch(newCtx->CurrentDispatch);
1413
1414 if (drawBuffer && readBuffer) {
1415 /* TODO: check if newCtx and buffer's visual match??? */
1416
1417 ASSERT(drawBuffer->Name == 0);
1418 ASSERT(readBuffer->Name == 0);
1419 _mesa_reference_framebuffer(&newCtx->WinSysDrawBuffer, drawBuffer);
1420 _mesa_reference_framebuffer(&newCtx->WinSysReadBuffer, readBuffer);
1421
1422 /*
1423 * Only set the context's Draw/ReadBuffer fields if they're NULL
1424 * or not bound to a user-created FBO.
1425 */
1426 if (!newCtx->DrawBuffer || newCtx->DrawBuffer->Name == 0) {
1427 /* KW: merge conflict here, revisit.
1428 */
1429 /* fix up the fb fields - these will end up wrong otherwise
1430 * if the DRIdrawable changes, and everything relies on them.
1431 * This is a bit messy (same as needed in _mesa_BindFramebufferEXT)
1432 */
1433 unsigned int i;
1434 GLenum buffers[MAX_DRAW_BUFFERS];
1435
1436 _mesa_reference_framebuffer(&newCtx->DrawBuffer, drawBuffer);
1437
1438 for(i = 0; i < newCtx->Const.MaxDrawBuffers; i++) {
1439 buffers[i] = newCtx->Color.DrawBuffer[i];
1440 }
1441
1442 _mesa_drawbuffers(newCtx, newCtx->Const.MaxDrawBuffers, buffers, NULL);
1443 }
1444 if (!newCtx->ReadBuffer || newCtx->ReadBuffer->Name == 0) {
1445 _mesa_reference_framebuffer(&newCtx->ReadBuffer, readBuffer);
1446 }
1447
1448 /* XXX only set this flag if we're really changing the draw/read
1449 * framebuffer bindings.
1450 */
1451 newCtx->NewState |= _NEW_BUFFERS;
1452
1453 #if 1
1454 /* We want to get rid of these lines: */
1455
1456 #if _HAVE_FULL_GL
1457 if (!drawBuffer->Initialized) {
1458 initialize_framebuffer_size(newCtx, drawBuffer);
1459 }
1460 if (readBuffer != drawBuffer && !readBuffer->Initialized) {
1461 initialize_framebuffer_size(newCtx, readBuffer);
1462 }
1463
1464 _mesa_resizebuffers(newCtx);
1465 #endif
1466
1467 #else
1468 /* We want the drawBuffer and readBuffer to be initialized by
1469 * the driver.
1470 * This generally means the Width and Height match the actual
1471 * window size and the renderbuffers (both hardware and software
1472 * based) are allocated to match. The later can generally be
1473 * done with a call to _mesa_resize_framebuffer().
1474 *
1475 * It's theoretically possible for a buffer to have zero width
1476 * or height, but for now, assert check that the driver did what's
1477 * expected of it.
1478 */
1479 ASSERT(drawBuffer->Width > 0);
1480 ASSERT(drawBuffer->Height > 0);
1481 #endif
1482
1483 if (drawBuffer) {
1484 _mesa_check_init_viewport(newCtx,
1485 drawBuffer->Width, drawBuffer->Height);
1486 }
1487 }
1488
1489 if (newCtx->FirstTimeCurrent) {
1490 _mesa_compute_version(newCtx);
1491
1492 newCtx->Extensions.String = _mesa_make_extension_string(newCtx);
1493
1494 check_context_limits(newCtx);
1495
1496 /* We can use this to help debug user's problems. Tell them to set
1497 * the MESA_INFO env variable before running their app. Then the
1498 * first time each context is made current we'll print some useful
1499 * information.
1500 */
1501 if (_mesa_getenv("MESA_INFO")) {
1502 _mesa_print_info();
1503 }
1504
1505 newCtx->FirstTimeCurrent = GL_FALSE;
1506 }
1507 }
1508
1509 return GL_TRUE;
1510 }
1511
1512
1513 /**
1514 * Make context 'ctx' share the display lists, textures and programs
1515 * that are associated with 'ctxToShare'.
1516 * Any display lists, textures or programs associated with 'ctx' will
1517 * be deleted if nobody else is sharing them.
1518 */
1519 GLboolean
1520 _mesa_share_state(struct gl_context *ctx, struct gl_context *ctxToShare)
1521 {
1522 if (ctx && ctxToShare && ctx->Shared && ctxToShare->Shared) {
1523 struct gl_shared_state *oldSharedState = ctx->Shared;
1524
1525 ctx->Shared = ctxToShare->Shared;
1526
1527 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
1528 ctx->Shared->RefCount++;
1529 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1530
1531 update_default_objects(ctx);
1532
1533 _mesa_release_shared_state(ctx, oldSharedState);
1534
1535 return GL_TRUE;
1536 }
1537 else {
1538 return GL_FALSE;
1539 }
1540 }
1541
1542
1543
1544 /**
1545 * \return pointer to the current GL context for this thread.
1546 *
1547 * Calls _glapi_get_context(). This isn't the fastest way to get the current
1548 * context. If you need speed, see the #GET_CURRENT_CONTEXT macro in
1549 * context.h.
1550 */
1551 struct gl_context *
1552 _mesa_get_current_context( void )
1553 {
1554 return (struct gl_context *) _glapi_get_context();
1555 }
1556
1557
1558 /**
1559 * Get context's current API dispatch table.
1560 *
1561 * It'll either be the immediate-mode execute dispatcher or the display list
1562 * compile dispatcher.
1563 *
1564 * \param ctx GL context.
1565 *
1566 * \return pointer to dispatch_table.
1567 *
1568 * Simply returns __struct gl_contextRec::CurrentDispatch.
1569 */
1570 struct _glapi_table *
1571 _mesa_get_dispatch(struct gl_context *ctx)
1572 {
1573 return ctx->CurrentDispatch;
1574 }
1575
1576 /*@}*/
1577
1578
1579 /**********************************************************************/
1580 /** \name Miscellaneous functions */
1581 /**********************************************************************/
1582 /*@{*/
1583
1584 /**
1585 * Record an error.
1586 *
1587 * \param ctx GL context.
1588 * \param error error code.
1589 *
1590 * Records the given error code and call the driver's dd_function_table::Error
1591 * function if defined.
1592 *
1593 * \sa
1594 * This is called via _mesa_error().
1595 */
1596 void
1597 _mesa_record_error(struct gl_context *ctx, GLenum error)
1598 {
1599 if (!ctx)
1600 return;
1601
1602 if (ctx->ErrorValue == GL_NO_ERROR) {
1603 ctx->ErrorValue = error;
1604 }
1605
1606 /* Call device driver's error handler, if any. This is used on the Mac. */
1607 if (ctx->Driver.Error) {
1608 ctx->Driver.Error(ctx);
1609 }
1610 }
1611
1612
1613 /**
1614 * Flush commands and wait for completion.
1615 */
1616 void
1617 _mesa_finish(struct gl_context *ctx)
1618 {
1619 FLUSH_CURRENT( ctx, 0 );
1620 if (ctx->Driver.Finish) {
1621 ctx->Driver.Finish(ctx);
1622 }
1623 }
1624
1625
1626 /**
1627 * Flush commands.
1628 */
1629 void
1630 _mesa_flush(struct gl_context *ctx)
1631 {
1632 FLUSH_CURRENT( ctx, 0 );
1633 if (ctx->Driver.Flush) {
1634 ctx->Driver.Flush(ctx);
1635 }
1636 }
1637
1638
1639
1640 /**
1641 * Execute glFinish().
1642 *
1643 * Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the
1644 * dd_function_table::Finish driver callback, if not NULL.
1645 */
1646 void GLAPIENTRY
1647 _mesa_Finish(void)
1648 {
1649 GET_CURRENT_CONTEXT(ctx);
1650 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1651 _mesa_finish(ctx);
1652 }
1653
1654
1655 /**
1656 * Execute glFlush().
1657 *
1658 * Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the
1659 * dd_function_table::Flush driver callback, if not NULL.
1660 */
1661 void GLAPIENTRY
1662 _mesa_Flush(void)
1663 {
1664 GET_CURRENT_CONTEXT(ctx);
1665 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1666 _mesa_flush(ctx);
1667 }
1668
1669
1670 /**
1671 * Set mvp_with_dp4 flag. If a driver has a preference for DP4 over
1672 * MUL/MAD, or vice versa, call this function to register that.
1673 * Otherwise we default to MUL/MAD.
1674 */
1675 void
1676 _mesa_set_mvp_with_dp4( struct gl_context *ctx,
1677 GLboolean flag )
1678 {
1679 ctx->mvp_with_dp4 = flag;
1680 }
1681
1682
1683
1684 /**
1685 * Prior to drawing anything with glBegin, glDrawArrays, etc. this function
1686 * is called to see if it's valid to render. This involves checking that
1687 * the current shader is valid and the framebuffer is complete.
1688 * If an error is detected it'll be recorded here.
1689 * \return GL_TRUE if OK to render, GL_FALSE if not
1690 */
1691 GLboolean
1692 _mesa_valid_to_render(struct gl_context *ctx, const char *where)
1693 {
1694 bool vert_from_glsl_shader = false;
1695 bool geom_from_glsl_shader = false;
1696 bool frag_from_glsl_shader = false;
1697
1698 /* This depends on having up to date derived state (shaders) */
1699 if (ctx->NewState)
1700 _mesa_update_state(ctx);
1701
1702 if (ctx->Shader.CurrentVertexProgram) {
1703 vert_from_glsl_shader = true;
1704
1705 if (!ctx->Shader.CurrentVertexProgram->LinkStatus) {
1706 _mesa_error(ctx, GL_INVALID_OPERATION,
1707 "%s(shader not linked)", where);
1708 return GL_FALSE;
1709 }
1710 #if 0 /* not normally enabled */
1711 {
1712 char errMsg[100];
1713 if (!_mesa_validate_shader_program(ctx,
1714 ctx->Shader.CurrentVertexProgram,
1715 errMsg)) {
1716 _mesa_warning(ctx, "Shader program %u is invalid: %s",
1717 ctx->Shader.CurrentVertexProgram->Name, errMsg);
1718 }
1719 }
1720 #endif
1721 }
1722
1723 if (ctx->Shader.CurrentGeometryProgram) {
1724 geom_from_glsl_shader = true;
1725
1726 if (!ctx->Shader.CurrentGeometryProgram->LinkStatus) {
1727 _mesa_error(ctx, GL_INVALID_OPERATION,
1728 "%s(shader not linked)", where);
1729 return GL_FALSE;
1730 }
1731 #if 0 /* not normally enabled */
1732 {
1733 char errMsg[100];
1734 if (!_mesa_validate_shader_program(ctx,
1735 ctx->Shader.CurrentGeometryProgram,
1736 errMsg)) {
1737 _mesa_warning(ctx, "Shader program %u is invalid: %s",
1738 ctx->Shader.CurrentGeometryProgram->Name, errMsg);
1739 }
1740 }
1741 #endif
1742 }
1743
1744 if (ctx->Shader.CurrentFragmentProgram) {
1745 frag_from_glsl_shader = true;
1746
1747 if (!ctx->Shader.CurrentFragmentProgram->LinkStatus) {
1748 _mesa_error(ctx, GL_INVALID_OPERATION,
1749 "%s(shader not linked)", where);
1750 return GL_FALSE;
1751 }
1752 #if 0 /* not normally enabled */
1753 {
1754 char errMsg[100];
1755 if (!_mesa_validate_shader_program(ctx,
1756 ctx->Shader.CurrentFragmentProgram,
1757 errMsg)) {
1758 _mesa_warning(ctx, "Shader program %u is invalid: %s",
1759 ctx->Shader.CurrentFragmentProgram->Name, errMsg);
1760 }
1761 }
1762 #endif
1763 }
1764
1765 /* Any shader stages that are not supplied by the GLSL shader and have
1766 * assembly shaders enabled must now be validated.
1767 */
1768 if (!vert_from_glsl_shader
1769 && ctx->VertexProgram.Enabled && !ctx->VertexProgram._Enabled) {
1770 _mesa_error(ctx, GL_INVALID_OPERATION,
1771 "%s(vertex program not valid)", where);
1772 return GL_FALSE;
1773 }
1774
1775 /* FINISHME: If GL_NV_geometry_program4 is ever supported, the current
1776 * FINISHME: geometry program should validated here.
1777 */
1778 (void) geom_from_glsl_shader;
1779
1780 if (!frag_from_glsl_shader) {
1781 if (ctx->FragmentProgram.Enabled && !ctx->FragmentProgram._Enabled) {
1782 _mesa_error(ctx, GL_INVALID_OPERATION,
1783 "%s(fragment program not valid)", where);
1784 return GL_FALSE;
1785 }
1786
1787 /* If drawing to integer-valued color buffers, there must be an
1788 * active fragment shader (GL_EXT_texture_integer).
1789 */
1790 if (ctx->DrawBuffer && ctx->DrawBuffer->_IntegerColor) {
1791 _mesa_error(ctx, GL_INVALID_OPERATION,
1792 "%s(integer format but no fragment shader)", where);
1793 return GL_FALSE;
1794 }
1795 }
1796
1797 if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
1798 _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
1799 "%s(incomplete framebuffer)", where);
1800 return GL_FALSE;
1801 }
1802
1803 #ifdef DEBUG
1804 if (ctx->Shader.Flags & GLSL_LOG) {
1805 struct gl_shader_program *shProg[MESA_SHADER_TYPES];
1806 unsigned i;
1807
1808 shProg[MESA_SHADER_VERTEX] = ctx->Shader.CurrentVertexProgram;
1809 shProg[MESA_SHADER_GEOMETRY] = ctx->Shader.CurrentGeometryProgram;
1810 shProg[MESA_SHADER_FRAGMENT] = ctx->Shader.CurrentFragmentProgram;
1811
1812 for (i = 0; i < MESA_SHADER_TYPES; i++) {
1813 struct gl_shader *sh;
1814
1815 if (shProg[i] == NULL || shProg[i]->_Used
1816 || shProg[i]->_LinkedShaders[i] == NULL)
1817 continue;
1818
1819 /* This is the first time this shader is being used.
1820 * Append shader's constants/uniforms to log file.
1821 *
1822 * The logic is a little odd here. We only want to log data for each
1823 * shader target that will actually be used, and we only want to log
1824 * it once. It's possible to have a program bound to the vertex
1825 * shader target that also supplied a fragment shader. If that
1826 * program isn't also bound to the fragment shader target we don't
1827 * want to log its fragment data.
1828 */
1829 sh = shProg[i]->_LinkedShaders[i];
1830 switch (sh->Type) {
1831 case GL_VERTEX_SHADER:
1832 _mesa_append_uniforms_to_file(sh, &shProg[i]->VertexProgram->Base);
1833 break;
1834
1835 case GL_GEOMETRY_SHADER_ARB:
1836 _mesa_append_uniforms_to_file(sh,
1837 &shProg[i]->GeometryProgram->Base);
1838 break;
1839
1840 case GL_FRAGMENT_SHADER:
1841 _mesa_append_uniforms_to_file(sh,
1842 &shProg[i]->FragmentProgram->Base);
1843 break;
1844 }
1845 }
1846
1847 for (i = 0; i < MESA_SHADER_TYPES; i++) {
1848 if (shProg[i] != NULL)
1849 shProg[i]->_Used = GL_TRUE;
1850 }
1851 }
1852 #endif
1853
1854 return GL_TRUE;
1855 }
1856
1857
1858 /*@}*/