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