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