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