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