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