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