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