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