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