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