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