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