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