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