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