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 
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 #include "util/u_memory.h"
156 
157 
158 #ifndef MESA_VERBOSE
159 int MESA_VERBOSE = 0;
160 #endif
161 
162 #ifndef MESA_DEBUG_FLAGS
163 int MESA_DEBUG_FLAGS = 0;
164 #endif
165 
166 
167 /* ubyte -> float conversion */
168 GLfloat _mesa_ubyte_to_float_color_tab[256];
169 
170 
171 
172 /**
173  * Swap buffers notification callback.
174  *
175  * \param ctx GL context.
176  *
177  * Called by window system just before swapping buffers.
178  * We have to finish any pending rendering.
179  */
180 void
_mesa_notifySwapBuffers(struct gl_context * ctx)181 _mesa_notifySwapBuffers(struct gl_context *ctx)
182 {
183    if (MESA_VERBOSE & VERBOSE_SWAPBUFFERS)
184       _mesa_debug(ctx, "SwapBuffers\n");
185    FLUSH_VERTICES(ctx, 0);
186    if (ctx->Driver.Flush) {
187       ctx->Driver.Flush(ctx);
188    }
189 }
190 
191 
192 /**********************************************************************/
193 /** \name GL Visual allocation/destruction                            */
194 /**********************************************************************/
195 /*@{*/
196 
197 /**
198  * Allocates a struct gl_config structure and initializes it via
199  * _mesa_initialize_visual().
200  *
201  * \param dbFlag double buffering
202  * \param stereoFlag stereo buffer
203  * \param depthBits requested bits per depth buffer value. Any value in [0, 32]
204  * is acceptable but the actual depth type will be GLushort or GLuint as
205  * needed.
206  * \param stencilBits requested minimum bits per stencil buffer value
207  * \param accumRedBits, accumGreenBits, accumBlueBits, accumAlphaBits number
208  * of bits per color component in accum buffer.
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 *
_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)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
_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)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->doubleBufferMode = dbFlag;
292    vis->stereoMode       = stereoFlag;
293 
294    vis->redBits          = redBits;
295    vis->greenBits        = greenBits;
296    vis->blueBits         = blueBits;
297    vis->alphaBits        = alphaBits;
298    vis->rgbBits          = redBits + greenBits + blueBits;
299 
300    vis->depthBits      = depthBits;
301    vis->stencilBits    = stencilBits;
302 
303    vis->accumRedBits   = accumRedBits;
304    vis->accumGreenBits = accumGreenBits;
305    vis->accumBlueBits  = accumBlueBits;
306    vis->accumAlphaBits = accumAlphaBits;
307 
308    vis->numAuxBuffers = 0;
309    vis->level = 0;
310    vis->sampleBuffers = numSamples > 0 ? 1 : 0;
311    vis->samples = numSamples;
312 
313    return GL_TRUE;
314 }
315 
316 
317 /**
318  * Destroy a visual and free its memory.
319  *
320  * \param vis visual.
321  *
322  * Frees the visual structure.
323  */
324 void
_mesa_destroy_visual(struct gl_config * vis)325 _mesa_destroy_visual( struct gl_config *vis )
326 {
327    free(vis);
328 }
329 
330 /*@}*/
331 
332 
333 /**********************************************************************/
334 /** \name Context allocation, initialization, destroying
335  *
336  * The purpose of the most initialization functions here is to provide the
337  * default state values according to the OpenGL specification.
338  */
339 /**********************************************************************/
340 /*@{*/
341 
342 
343 /**
344  * One-time initialization mutex lock.
345  *
346  * \sa Used by one_time_init().
347  */
348 mtx_t OneTimeLock = _MTX_INITIALIZER_NP;
349 
350 
351 /**
352  * Calls all the various one-time-fini functions in Mesa
353  */
354 
355 static void
one_time_fini(void)356 one_time_fini(void)
357 {
358    glsl_type_singleton_decref();
359    _mesa_locale_fini();
360 }
361 
362 /**
363  * Calls all the various one-time-init functions in Mesa.
364  *
365  * While holding a global mutex lock, calls several initialization functions,
366  * and sets the glapi callbacks if the \c MESA_DEBUG environment variable is
367  * defined.
368  *
369  * \sa _math_init().
370  */
371 void
_mesa_initialize(void)372 _mesa_initialize(void)
373 {
374    static bool initialized;
375 
376    mtx_lock(&OneTimeLock);
377 
378    /* truly one-time init */
379    if (!initialized) {
380       GLuint i;
381 
382       STATIC_ASSERT(sizeof(GLbyte) == 1);
383       STATIC_ASSERT(sizeof(GLubyte) == 1);
384       STATIC_ASSERT(sizeof(GLshort) == 2);
385       STATIC_ASSERT(sizeof(GLushort) == 2);
386       STATIC_ASSERT(sizeof(GLint) == 4);
387       STATIC_ASSERT(sizeof(GLuint) == 4);
388 
389       _mesa_locale_init();
390 
391       _mesa_one_time_init_extension_overrides();
392 
393       _mesa_get_cpu_features();
394 
395       for (i = 0; i < 256; i++) {
396          _mesa_ubyte_to_float_color_tab[i] = (float) i / 255.0F;
397       }
398 
399       atexit(one_time_fini);
400 
401 #if defined(DEBUG)
402       if (MESA_VERBOSE != 0) {
403          _mesa_debug(NULL, "Mesa " PACKAGE_VERSION " DEBUG build" MESA_GIT_SHA1 "\n");
404       }
405 #endif
406 
407       /* Take a glsl type reference for the duration of libGL's life to avoid
408        * unecessary creation/destruction of glsl types.
409        */
410       glsl_type_singleton_init_or_ref();
411 
412       _mesa_init_remap_table();
413    }
414 
415    initialized = true;
416 
417    mtx_unlock(&OneTimeLock);
418 }
419 
420 
421 /**
422  * Initialize fields of gl_current_attrib (aka ctx->Current.*)
423  */
424 static void
_mesa_init_current(struct gl_context * ctx)425 _mesa_init_current(struct gl_context *ctx)
426 {
427    GLuint i;
428 
429    /* Init all to (0,0,0,1) */
430    for (i = 0; i < ARRAY_SIZE(ctx->Current.Attrib); i++) {
431       ASSIGN_4V( ctx->Current.Attrib[i], 0.0, 0.0, 0.0, 1.0 );
432    }
433 
434    /* redo special cases: */
435    ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 1.0 );
436    ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 );
437    ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR1], 0.0, 0.0, 0.0, 1.0 );
438    ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR_INDEX], 1.0, 0.0, 0.0, 1.0 );
439    ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_EDGEFLAG], 1.0, 0.0, 0.0, 1.0 );
440 }
441 
442 
443 /**
444  * Init vertex/fragment/geometry program limits.
445  * Important: drivers should override these with actual limits.
446  */
447 static void
init_program_limits(struct gl_constants * consts,gl_shader_stage stage,struct gl_program_constants * prog)448 init_program_limits(struct gl_constants *consts, gl_shader_stage stage,
449                     struct gl_program_constants *prog)
450 {
451    prog->MaxInstructions = MAX_PROGRAM_INSTRUCTIONS;
452    prog->MaxAluInstructions = MAX_PROGRAM_INSTRUCTIONS;
453    prog->MaxTexInstructions = MAX_PROGRAM_INSTRUCTIONS;
454    prog->MaxTexIndirections = MAX_PROGRAM_INSTRUCTIONS;
455    prog->MaxTemps = MAX_PROGRAM_TEMPS;
456    prog->MaxEnvParams = MAX_PROGRAM_ENV_PARAMS;
457    prog->MaxLocalParams = MAX_PROGRAM_LOCAL_PARAMS;
458    prog->MaxAddressOffset = MAX_PROGRAM_LOCAL_PARAMS;
459 
460    switch (stage) {
461    case MESA_SHADER_VERTEX:
462       prog->MaxParameters = MAX_VERTEX_PROGRAM_PARAMS;
463       prog->MaxAttribs = MAX_VERTEX_GENERIC_ATTRIBS;
464       prog->MaxAddressRegs = MAX_VERTEX_PROGRAM_ADDRESS_REGS;
465       prog->MaxUniformComponents = 4 * MAX_UNIFORMS;
466       prog->MaxInputComponents = 0; /* value not used */
467       prog->MaxOutputComponents = 16 * 4; /* old limit not to break tnl and swrast */
468       break;
469    case MESA_SHADER_FRAGMENT:
470       prog->MaxParameters = MAX_FRAGMENT_PROGRAM_PARAMS;
471       prog->MaxAttribs = MAX_FRAGMENT_PROGRAM_INPUTS;
472       prog->MaxAddressRegs = MAX_FRAGMENT_PROGRAM_ADDRESS_REGS;
473       prog->MaxUniformComponents = 4 * MAX_UNIFORMS;
474       prog->MaxInputComponents = 16 * 4; /* old limit not to break tnl and swrast */
475       prog->MaxOutputComponents = 0; /* value not used */
476       break;
477    case MESA_SHADER_TESS_CTRL:
478    case MESA_SHADER_TESS_EVAL:
479    case MESA_SHADER_GEOMETRY:
480       prog->MaxParameters = MAX_VERTEX_PROGRAM_PARAMS;
481       prog->MaxAttribs = MAX_VERTEX_GENERIC_ATTRIBS;
482       prog->MaxAddressRegs = MAX_VERTEX_PROGRAM_ADDRESS_REGS;
483       prog->MaxUniformComponents = 4 * MAX_UNIFORMS;
484       prog->MaxInputComponents = 16 * 4; /* old limit not to break tnl and swrast */
485       prog->MaxOutputComponents = 16 * 4; /* old limit not to break tnl and swrast */
486       break;
487    case MESA_SHADER_COMPUTE:
488       prog->MaxParameters = 0; /* not meaningful for compute shaders */
489       prog->MaxAttribs = 0; /* not meaningful for compute shaders */
490       prog->MaxAddressRegs = 0; /* not meaningful for compute shaders */
491       prog->MaxUniformComponents = 4 * MAX_UNIFORMS;
492       prog->MaxInputComponents = 0; /* not meaningful for compute shaders */
493       prog->MaxOutputComponents = 0; /* not meaningful for compute shaders */
494       break;
495    default:
496       assert(0 && "Bad shader stage in init_program_limits()");
497    }
498 
499    /* Set the native limits to zero.  This implies that there is no native
500     * support for shaders.  Let the drivers fill in the actual values.
501     */
502    prog->MaxNativeInstructions = 0;
503    prog->MaxNativeAluInstructions = 0;
504    prog->MaxNativeTexInstructions = 0;
505    prog->MaxNativeTexIndirections = 0;
506    prog->MaxNativeAttribs = 0;
507    prog->MaxNativeTemps = 0;
508    prog->MaxNativeAddressRegs = 0;
509    prog->MaxNativeParameters = 0;
510 
511    /* Set GLSL datatype range/precision info assuming IEEE float values.
512     * Drivers should override these defaults as needed.
513     */
514    prog->MediumFloat.RangeMin = 127;
515    prog->MediumFloat.RangeMax = 127;
516    prog->MediumFloat.Precision = 23;
517    prog->LowFloat = prog->HighFloat = prog->MediumFloat;
518 
519    /* Assume ints are stored as floats for now, since this is the least-common
520     * denominator.  The OpenGL ES spec implies (page 132) that the precision
521     * of integer types should be 0.  Practically speaking, IEEE
522     * single-precision floating point values can only store integers in the
523     * range [-0x01000000, 0x01000000] without loss of precision.
524     */
525    prog->MediumInt.RangeMin = 24;
526    prog->MediumInt.RangeMax = 24;
527    prog->MediumInt.Precision = 0;
528    prog->LowInt = prog->HighInt = prog->MediumInt;
529 
530    prog->MaxUniformBlocks = 12;
531    prog->MaxCombinedUniformComponents = (prog->MaxUniformComponents +
532                                          consts->MaxUniformBlockSize / 4 *
533                                          prog->MaxUniformBlocks);
534 
535    prog->MaxAtomicBuffers = 0;
536    prog->MaxAtomicCounters = 0;
537 
538    prog->MaxShaderStorageBlocks = 8;
539 }
540 
541 
542 /**
543  * Initialize fields of gl_constants (aka ctx->Const.*).
544  * Use defaults from config.h.  The device drivers will often override
545  * some of these values (such as number of texture units).
546  */
547 void
_mesa_init_constants(struct gl_constants * consts,gl_api api)548 _mesa_init_constants(struct gl_constants *consts, gl_api api)
549 {
550    int i;
551    assert(consts);
552 
553    /* Constants, may be overriden (usually only reduced) by device drivers */
554    consts->MaxTextureMbytes = MAX_TEXTURE_MBYTES;
555    consts->MaxTextureSize = 1 << (MAX_TEXTURE_LEVELS - 1);
556    consts->Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS;
557    consts->MaxCubeTextureLevels = MAX_CUBE_TEXTURE_LEVELS;
558    consts->MaxTextureRectSize = MAX_TEXTURE_RECT_SIZE;
559    consts->MaxArrayTextureLayers = MAX_ARRAY_TEXTURE_LAYERS;
560    consts->MaxTextureCoordUnits = MAX_TEXTURE_COORD_UNITS;
561    consts->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
562    consts->MaxTextureUnits = MIN2(consts->MaxTextureCoordUnits,
563                                      consts->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits);
564    consts->MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY;
565    consts->MaxTextureLodBias = MAX_TEXTURE_LOD_BIAS;
566    consts->MaxTextureBufferSize = 65536;
567    consts->TextureBufferOffsetAlignment = 1;
568    consts->MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
569    consts->SubPixelBits = SUB_PIXEL_BITS;
570    consts->MinPointSize = MIN_POINT_SIZE;
571    consts->MaxPointSize = MAX_POINT_SIZE;
572    consts->MinPointSizeAA = MIN_POINT_SIZE;
573    consts->MaxPointSizeAA = MAX_POINT_SIZE;
574    consts->PointSizeGranularity = (GLfloat) POINT_SIZE_GRANULARITY;
575    consts->MinLineWidth = MIN_LINE_WIDTH;
576    consts->MaxLineWidth = MAX_LINE_WIDTH;
577    consts->MinLineWidthAA = MIN_LINE_WIDTH;
578    consts->MaxLineWidthAA = MAX_LINE_WIDTH;
579    consts->LineWidthGranularity = (GLfloat) LINE_WIDTH_GRANULARITY;
580    consts->MaxClipPlanes = 6;
581    consts->MaxLights = MAX_LIGHTS;
582    consts->MaxShininess = 128.0;
583    consts->MaxSpotExponent = 128.0;
584    consts->MaxViewportWidth = 16384;
585    consts->MaxViewportHeight = 16384;
586    consts->MinMapBufferAlignment = 64;
587 
588    /* Driver must override these values if ARB_viewport_array is supported. */
589    consts->MaxViewports = 1;
590    consts->ViewportSubpixelBits = 0;
591    consts->ViewportBounds.Min = 0;
592    consts->ViewportBounds.Max = 0;
593 
594    /** GL_ARB_uniform_buffer_object */
595    consts->MaxCombinedUniformBlocks = 36;
596    consts->MaxUniformBufferBindings = 36;
597    consts->MaxUniformBlockSize = 16384;
598    consts->UniformBufferOffsetAlignment = 1;
599 
600    /** GL_ARB_shader_storage_buffer_object */
601    consts->MaxCombinedShaderStorageBlocks = 8;
602    consts->MaxShaderStorageBufferBindings = 8;
603    consts->MaxShaderStorageBlockSize = 128 * 1024 * 1024; /* 2^27 */
604    consts->ShaderStorageBufferOffsetAlignment = 256;
605 
606    /* GL_ARB_explicit_uniform_location, GL_MAX_UNIFORM_LOCATIONS */
607    consts->MaxUserAssignableUniformLocations =
608       4 * MESA_SHADER_STAGES * MAX_UNIFORMS;
609 
610    for (i = 0; i < MESA_SHADER_STAGES; i++)
611       init_program_limits(consts, i, &consts->Program[i]);
612 
613    consts->MaxProgramMatrices = MAX_PROGRAM_MATRICES;
614    consts->MaxProgramMatrixStackDepth = MAX_PROGRAM_MATRIX_STACK_DEPTH;
615 
616    /* Set the absolute minimum possible GLSL version.  API_OPENGL_CORE can
617     * mean an OpenGL 3.0 forward-compatible context, so that implies a minimum
618     * possible version of 1.30.  Otherwise, the minimum possible version 1.20.
619     * Since Mesa unconditionally advertises GL_ARB_shading_language_100 and
620     * GL_ARB_shader_objects, every driver has GLSL 1.20... even if they don't
621     * advertise any extensions to enable any shader stages (e.g.,
622     * GL_ARB_vertex_shader).
623     */
624    consts->GLSLVersion = api == API_OPENGL_CORE ? 130 : 120;
625    consts->GLSLVersionCompat = consts->GLSLVersion;
626 
627    consts->GLSLLowerConstArrays = true;
628 
629    /* Assume that if GLSL 1.30+ (or GLSL ES 3.00+) is supported that
630     * gl_VertexID is implemented using a native hardware register with OpenGL
631     * semantics.
632     */
633    consts->VertexID_is_zero_based = false;
634 
635    /* GL_ARB_draw_buffers */
636    consts->MaxDrawBuffers = MAX_DRAW_BUFFERS;
637 
638    consts->MaxColorAttachments = MAX_COLOR_ATTACHMENTS;
639    consts->MaxRenderbufferSize = MAX_RENDERBUFFER_SIZE;
640 
641    consts->Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
642    consts->MaxCombinedTextureImageUnits = MAX_COMBINED_TEXTURE_IMAGE_UNITS;
643    consts->MaxVarying = 16; /* old limit not to break tnl and swrast */
644    consts->Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
645    consts->MaxGeometryOutputVertices = MAX_GEOMETRY_OUTPUT_VERTICES;
646    consts->MaxGeometryTotalOutputComponents = MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS;
647    consts->MaxGeometryShaderInvocations = MAX_GEOMETRY_SHADER_INVOCATIONS;
648 
649 #ifdef DEBUG
650    consts->GenerateTemporaryNames = true;
651 #else
652    consts->GenerateTemporaryNames = false;
653 #endif
654 
655    /* GL_ARB_framebuffer_object */
656    consts->MaxSamples = 0;
657 
658    /* GLSL default if NativeIntegers == FALSE */
659    consts->UniformBooleanTrue = FLOAT_AS_UNION(1.0f).u;
660 
661    /* GL_ARB_sync */
662    consts->MaxServerWaitTimeout = 0x7fffffff7fffffffULL;
663 
664    /* GL_EXT_provoking_vertex */
665    consts->QuadsFollowProvokingVertexConvention = GL_TRUE;
666 
667    /** GL_ARB_viewport_array */
668    consts->LayerAndVPIndexProvokingVertex = GL_UNDEFINED_VERTEX;
669 
670    /* GL_EXT_transform_feedback */
671    consts->MaxTransformFeedbackBuffers = MAX_FEEDBACK_BUFFERS;
672    consts->MaxTransformFeedbackSeparateComponents = 4 * MAX_FEEDBACK_ATTRIBS;
673    consts->MaxTransformFeedbackInterleavedComponents = 4 * MAX_FEEDBACK_ATTRIBS;
674    consts->MaxVertexStreams = 1;
675 
676    /* GL 3.2  */
677    consts->ProfileMask = api == API_OPENGL_CORE
678                           ? GL_CONTEXT_CORE_PROFILE_BIT
679                           : GL_CONTEXT_COMPATIBILITY_PROFILE_BIT;
680 
681    /* GL 4.4 */
682    consts->MaxVertexAttribStride = 2048;
683 
684    /** GL_EXT_gpu_shader4 */
685    consts->MinProgramTexelOffset = -8;
686    consts->MaxProgramTexelOffset = 7;
687 
688    /* GL_ARB_texture_gather */
689    consts->MinProgramTextureGatherOffset = -8;
690    consts->MaxProgramTextureGatherOffset = 7;
691 
692    /* GL_ARB_robustness */
693    consts->ResetStrategy = GL_NO_RESET_NOTIFICATION_ARB;
694 
695    /* GL_KHR_robustness */
696    consts->RobustAccess = GL_FALSE;
697 
698    /* ES 3.0 or ARB_ES3_compatibility */
699    consts->MaxElementIndex = 0xffffffffu;
700 
701    /* GL_ARB_texture_multisample */
702    consts->MaxColorTextureSamples = 1;
703    consts->MaxDepthTextureSamples = 1;
704    consts->MaxIntegerSamples = 1;
705 
706    /* GL_ARB_shader_atomic_counters */
707    consts->MaxAtomicBufferBindings = MAX_COMBINED_ATOMIC_BUFFERS;
708    consts->MaxAtomicBufferSize = MAX_ATOMIC_COUNTERS * ATOMIC_COUNTER_SIZE;
709    consts->MaxCombinedAtomicBuffers = MAX_COMBINED_ATOMIC_BUFFERS;
710    consts->MaxCombinedAtomicCounters = MAX_ATOMIC_COUNTERS;
711 
712    /* GL_ARB_vertex_attrib_binding */
713    consts->MaxVertexAttribRelativeOffset = 2047;
714    consts->MaxVertexAttribBindings = MAX_VERTEX_GENERIC_ATTRIBS;
715 
716    /* GL_ARB_compute_shader */
717    consts->MaxComputeWorkGroupCount[0] = 65535;
718    consts->MaxComputeWorkGroupCount[1] = 65535;
719    consts->MaxComputeWorkGroupCount[2] = 65535;
720    consts->MaxComputeWorkGroupSize[0] = 1024;
721    consts->MaxComputeWorkGroupSize[1] = 1024;
722    consts->MaxComputeWorkGroupSize[2] = 64;
723    /* Enables compute support for GLES 3.1 if >= 128 */
724    consts->MaxComputeWorkGroupInvocations = 0;
725 
726    /** GL_ARB_gpu_shader5 */
727    consts->MinFragmentInterpolationOffset = MIN_FRAGMENT_INTERPOLATION_OFFSET;
728    consts->MaxFragmentInterpolationOffset = MAX_FRAGMENT_INTERPOLATION_OFFSET;
729 
730    /** GL_KHR_context_flush_control */
731    consts->ContextReleaseBehavior = GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH;
732 
733    /** GL_ARB_tessellation_shader */
734    consts->MaxTessGenLevel = MAX_TESS_GEN_LEVEL;
735    consts->MaxPatchVertices = MAX_PATCH_VERTICES;
736    consts->Program[MESA_SHADER_TESS_CTRL].MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
737    consts->Program[MESA_SHADER_TESS_EVAL].MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
738    consts->MaxTessPatchComponents = MAX_TESS_PATCH_COMPONENTS;
739    consts->MaxTessControlTotalOutputComponents = MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS;
740    consts->PrimitiveRestartForPatches = false;
741 
742    /** GL_ARB_compute_variable_group_size */
743    consts->MaxComputeVariableGroupSize[0] = 512;
744    consts->MaxComputeVariableGroupSize[1] = 512;
745    consts->MaxComputeVariableGroupSize[2] = 64;
746    consts->MaxComputeVariableGroupInvocations = 512;
747 
748    /** GL_NV_conservative_raster */
749    consts->MaxSubpixelPrecisionBiasBits = 0;
750 
751    /** GL_NV_conservative_raster_dilate */
752    consts->ConservativeRasterDilateRange[0] = 0.0;
753    consts->ConservativeRasterDilateRange[1] = 0.0;
754    consts->ConservativeRasterDilateGranularity = 0.0;
755 
756    consts->glBeginEndBufferSize = 512 * 1024;
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    _mesa_initialize();
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             _mesa_update_allow_draw_out_of_order(newCtx);
1767          }
1768          if (!newCtx->ReadBuffer || _mesa_is_winsys_fbo(newCtx->ReadBuffer)) {
1769             _mesa_reference_framebuffer(&newCtx->ReadBuffer, readBuffer);
1770             /* In _mesa_initialize_window_framebuffer, for single-buffered
1771              * visuals, the ColorReadBuffer is set to be GL_FRONT, even with
1772              * GLES contexts. When calling read_buffer, we verify we are reading
1773              * from GL_BACK in is_legal_es3_readbuffer_enum.  But the default is
1774              * incorrect, and certain dEQP tests check this.  So fix it here.
1775              */
1776             if (_mesa_is_gles(newCtx) &&
1777                !newCtx->ReadBuffer->Visual.doubleBufferMode)
1778                if (newCtx->ReadBuffer->ColorReadBuffer == GL_FRONT)
1779                   newCtx->ReadBuffer->ColorReadBuffer = GL_BACK;
1780          }
1781 
1782          /* XXX only set this flag if we're really changing the draw/read
1783           * framebuffer bindings.
1784           */
1785          newCtx->NewState |= _NEW_BUFFERS;
1786 
1787          check_init_viewport(newCtx, drawBuffer->Width, drawBuffer->Height);
1788       }
1789 
1790       if (newCtx->FirstTimeCurrent) {
1791          handle_first_current(newCtx);
1792          newCtx->FirstTimeCurrent = GL_FALSE;
1793       }
1794    }
1795 
1796    return GL_TRUE;
1797 }
1798 
1799 
1800 /**
1801  * Make context 'ctx' share the display lists, textures and programs
1802  * that are associated with 'ctxToShare'.
1803  * Any display lists, textures or programs associated with 'ctx' will
1804  * be deleted if nobody else is sharing them.
1805  */
1806 GLboolean
_mesa_share_state(struct gl_context * ctx,struct gl_context * ctxToShare)1807 _mesa_share_state(struct gl_context *ctx, struct gl_context *ctxToShare)
1808 {
1809    if (ctx && ctxToShare && ctx->Shared && ctxToShare->Shared) {
1810       struct gl_shared_state *oldShared = NULL;
1811 
1812       /* save ref to old state to prevent it from being deleted immediately */
1813       _mesa_reference_shared_state(ctx, &oldShared, ctx->Shared);
1814 
1815       /* update ctx's Shared pointer */
1816       _mesa_reference_shared_state(ctx, &ctx->Shared, ctxToShare->Shared);
1817 
1818       update_default_objects(ctx);
1819 
1820       /* release the old shared state */
1821       _mesa_reference_shared_state(ctx, &oldShared, NULL);
1822 
1823       return GL_TRUE;
1824    }
1825    else {
1826       return GL_FALSE;
1827    }
1828 }
1829 
1830 
1831 
1832 /**
1833  * \return pointer to the current GL context for this thread.
1834  *
1835  * Calls _glapi_get_context(). This isn't the fastest way to get the current
1836  * context.  If you need speed, see the #GET_CURRENT_CONTEXT macro in
1837  * context.h.
1838  */
1839 struct gl_context *
_mesa_get_current_context(void)1840 _mesa_get_current_context( void )
1841 {
1842    return (struct gl_context *) _glapi_get_context();
1843 }
1844 
1845 
1846 /**
1847  * Get context's current API dispatch table.
1848  *
1849  * It'll either be the immediate-mode execute dispatcher, the display list
1850  * compile dispatcher, or the thread marshalling dispatcher.
1851  *
1852  * \param ctx GL context.
1853  *
1854  * \return pointer to dispatch_table.
1855  *
1856  * Simply returns __struct gl_contextRec::CurrentClientDispatch.
1857  */
1858 struct _glapi_table *
_mesa_get_dispatch(struct gl_context * ctx)1859 _mesa_get_dispatch(struct gl_context *ctx)
1860 {
1861    return ctx->CurrentClientDispatch;
1862 }
1863 
1864 /*@}*/
1865 
1866 
1867 /**********************************************************************/
1868 /** \name Miscellaneous functions                                     */
1869 /**********************************************************************/
1870 /*@{*/
1871 /**
1872  * Flush commands.
1873  */
1874 void
_mesa_flush(struct gl_context * ctx)1875 _mesa_flush(struct gl_context *ctx)
1876 {
1877    FLUSH_VERTICES( 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 
1899    if (ctx->Driver.Finish) {
1900       ctx->Driver.Finish(ctx);
1901    }
1902 }
1903 
1904 
1905 /**
1906  * Execute glFlush().
1907  *
1908  * Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the
1909  * dd_function_table::Flush driver callback, if not NULL.
1910  */
1911 void GLAPIENTRY
_mesa_Flush(void)1912 _mesa_Flush(void)
1913 {
1914    GET_CURRENT_CONTEXT(ctx);
1915    ASSERT_OUTSIDE_BEGIN_END(ctx);
1916    _mesa_flush(ctx);
1917 }
1918 
1919 
1920 /*@}*/
1921