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