03ee7fb04d90fde7abf2b001c4eeb80211b66a76
[mesa.git] / src / mesa / main / context.c
1 /*
2 * Mesa 3-D graphics library
3 * Version: 7.3
4 *
5 * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
6 * Copyright (C) 2008 VMware, Inc. All Rights Reserved.
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included
16 * in all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23 * CONNECTION WITH THE SOFTWARE OR THE USE OR 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 "mfeatures.h"
81 #include "imports.h"
82 #include "accum.h"
83 #include "api_exec.h"
84 #include "arrayobj.h"
85 #include "attrib.h"
86 #include "blend.h"
87 #include "buffers.h"
88 #include "bufferobj.h"
89 #include "colortab.h"
90 #include "context.h"
91 #include "cpuinfo.h"
92 #include "debug.h"
93 #include "depth.h"
94 #if FEATURE_dlist
95 #include "dlist.h"
96 #endif
97 #include "eval.h"
98 #include "enums.h"
99 #include "extensions.h"
100 #include "fbobject.h"
101 #include "feedback.h"
102 #include "fog.h"
103 #include "framebuffer.h"
104 #include "get.h"
105 #include "histogram.h"
106 #include "hint.h"
107 #include "hash.h"
108 #include "light.h"
109 #include "lines.h"
110 #include "macros.h"
111 #include "matrix.h"
112 #include "multisample.h"
113 #include "pixel.h"
114 #include "pixelstore.h"
115 #include "points.h"
116 #include "polygon.h"
117 #include "queryobj.h"
118 #if FEATURE_ARB_sync
119 #include "syncobj.h"
120 #endif
121 #include "rastpos.h"
122 #include "scissor.h"
123 #include "shared.h"
124 #include "simple_list.h"
125 #include "state.h"
126 #include "stencil.h"
127 #include "texcompress.h"
128 #include "teximage.h"
129 #include "texobj.h"
130 #include "texstate.h"
131 #include "mtypes.h"
132 #include "varray.h"
133 #include "version.h"
134 #include "viewport.h"
135 #include "vtxfmt.h"
136 #include "glapi/glthread.h"
137 #include "glapi/glapioffsets.h"
138 #include "glapi/glapitable.h"
139 #include "shader/program.h"
140 #include "shader/prog_print.h"
141 #include "shader/shader_api.h"
142 #if FEATURE_ATI_fragment_shader
143 #include "shader/atifragshader.h"
144 #endif
145 #if _HAVE_FULL_GL
146 #include "math/m_matrix.h"
147 #endif
148
149 #ifdef USE_SPARC_ASM
150 #include "sparc/sparc.h"
151 #endif
152
153 #ifndef MESA_VERBOSE
154 int MESA_VERBOSE = 0;
155 #endif
156
157 #ifndef MESA_DEBUG_FLAGS
158 int MESA_DEBUG_FLAGS = 0;
159 #endif
160
161
162 /* ubyte -> float conversion */
163 GLfloat _mesa_ubyte_to_float_color_tab[256];
164
165
166
167 /**
168 * Swap buffers notification callback.
169 *
170 * \param ctx GL context.
171 *
172 * Called by window system just before swapping buffers.
173 * We have to finish any pending rendering.
174 */
175 void
176 _mesa_notifySwapBuffers(__GLcontext *ctx)
177 {
178 FLUSH_CURRENT( ctx, 0 );
179 if (ctx->Driver.Flush) {
180 ctx->Driver.Flush(ctx);
181 }
182 }
183
184
185 /**********************************************************************/
186 /** \name GL Visual allocation/destruction */
187 /**********************************************************************/
188 /*@{*/
189
190 /**
191 * Allocates a GLvisual structure and initializes it via
192 * _mesa_initialize_visual().
193 *
194 * \param rgbFlag GL_TRUE for RGB(A) mode, GL_FALSE for Color Index mode.
195 * \param dbFlag double buffering
196 * \param stereoFlag stereo buffer
197 * \param depthBits requested bits per depth buffer value. Any value in [0, 32]
198 * is acceptable but the actual depth type will be GLushort or GLuint as
199 * needed.
200 * \param stencilBits requested minimum bits per stencil buffer value
201 * \param accumRedBits, accumGreenBits, accumBlueBits, accumAlphaBits number of bits per color component in accum buffer.
202 * \param indexBits number of bits per pixel if \p rgbFlag is GL_FALSE
203 * \param redBits number of bits per color component in frame buffer for RGB(A)
204 * mode. We always use 8 in core Mesa though.
205 * \param greenBits same as above.
206 * \param blueBits same as above.
207 * \param alphaBits same as above.
208 * \param numSamples not really used.
209 *
210 * \return pointer to new GLvisual or NULL if requested parameters can't be
211 * met.
212 *
213 * \note Need to add params for level and numAuxBuffers (at least)
214 */
215 GLvisual *
216 _mesa_create_visual( GLboolean rgbFlag,
217 GLboolean dbFlag,
218 GLboolean stereoFlag,
219 GLint redBits,
220 GLint greenBits,
221 GLint blueBits,
222 GLint alphaBits,
223 GLint indexBits,
224 GLint depthBits,
225 GLint stencilBits,
226 GLint accumRedBits,
227 GLint accumGreenBits,
228 GLint accumBlueBits,
229 GLint accumAlphaBits,
230 GLint numSamples )
231 {
232 GLvisual *vis = (GLvisual *) _mesa_calloc(sizeof(GLvisual));
233 if (vis) {
234 if (!_mesa_initialize_visual(vis, rgbFlag, dbFlag, stereoFlag,
235 redBits, greenBits, blueBits, alphaBits,
236 indexBits, depthBits, stencilBits,
237 accumRedBits, accumGreenBits,
238 accumBlueBits, accumAlphaBits,
239 numSamples)) {
240 _mesa_free(vis);
241 return NULL;
242 }
243 }
244 return vis;
245 }
246
247 /**
248 * Makes some sanity checks and fills in the fields of the
249 * GLvisual object with the given parameters. If the caller needs
250 * to set additional fields, he should just probably init the whole GLvisual
251 * object himself.
252 * \return GL_TRUE on success, or GL_FALSE on failure.
253 *
254 * \sa _mesa_create_visual() above for the parameter description.
255 */
256 GLboolean
257 _mesa_initialize_visual( GLvisual *vis,
258 GLboolean rgbFlag,
259 GLboolean dbFlag,
260 GLboolean stereoFlag,
261 GLint redBits,
262 GLint greenBits,
263 GLint blueBits,
264 GLint alphaBits,
265 GLint indexBits,
266 GLint depthBits,
267 GLint stencilBits,
268 GLint accumRedBits,
269 GLint accumGreenBits,
270 GLint accumBlueBits,
271 GLint accumAlphaBits,
272 GLint numSamples )
273 {
274 assert(vis);
275
276 if (depthBits < 0 || depthBits > 32) {
277 return GL_FALSE;
278 }
279 if (stencilBits < 0 || stencilBits > STENCIL_BITS) {
280 return GL_FALSE;
281 }
282 assert(accumRedBits >= 0);
283 assert(accumGreenBits >= 0);
284 assert(accumBlueBits >= 0);
285 assert(accumAlphaBits >= 0);
286
287 vis->rgbMode = rgbFlag;
288 vis->doubleBufferMode = dbFlag;
289 vis->stereoMode = stereoFlag;
290
291 vis->redBits = redBits;
292 vis->greenBits = greenBits;
293 vis->blueBits = blueBits;
294 vis->alphaBits = alphaBits;
295 vis->rgbBits = redBits + greenBits + blueBits;
296
297 vis->indexBits = indexBits;
298 vis->depthBits = depthBits;
299 vis->stencilBits = stencilBits;
300
301 vis->accumRedBits = accumRedBits;
302 vis->accumGreenBits = accumGreenBits;
303 vis->accumBlueBits = accumBlueBits;
304 vis->accumAlphaBits = accumAlphaBits;
305
306 vis->haveAccumBuffer = accumRedBits > 0;
307 vis->haveDepthBuffer = depthBits > 0;
308 vis->haveStencilBuffer = stencilBits > 0;
309
310 vis->numAuxBuffers = 0;
311 vis->level = 0;
312 vis->pixmapMode = 0;
313 vis->sampleBuffers = numSamples > 0 ? 1 : 0;
314 vis->samples = numSamples;
315
316 return GL_TRUE;
317 }
318
319
320 /**
321 * Destroy a visual and free its memory.
322 *
323 * \param vis visual.
324 *
325 * Frees the visual structure.
326 */
327 void
328 _mesa_destroy_visual( GLvisual *vis )
329 {
330 _mesa_free(vis);
331 }
332
333 /*@}*/
334
335
336 /**********************************************************************/
337 /** \name Context allocation, initialization, destroying
338 *
339 * The purpose of the most initialization functions here is to provide the
340 * default state values according to the OpenGL specification.
341 */
342 /**********************************************************************/
343 /*@{*/
344
345
346 /**
347 * This is lame. gdb only seems to recognize enum types that are
348 * actually used somewhere. We want to be able to print/use enum
349 * values such as TEXTURE_2D_INDEX in gdb. But we don't actually use
350 * the gl_texture_index type anywhere. Thus, this lame function.
351 */
352 static void
353 dummy_enum_func(void)
354 {
355 gl_buffer_index bi;
356 gl_colortable_index ci;
357 gl_face_index fi;
358 gl_frag_attrib fa;
359 gl_frag_result fr;
360 gl_texture_index ti;
361 gl_vert_attrib va;
362 gl_vert_result vr;
363
364 (void) bi;
365 (void) ci;
366 (void) fi;
367 (void) fa;
368 (void) fr;
369 (void) ti;
370 (void) va;
371 (void) vr;
372 }
373
374
375 /**
376 * One-time initialization mutex lock.
377 *
378 * \sa Used by one_time_init().
379 */
380 _glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
381
382 /**
383 * Calls all the various one-time-init functions in Mesa.
384 *
385 * While holding a global mutex lock, calls several initialization functions,
386 * and sets the glapi callbacks if the \c MESA_DEBUG environment variable is
387 * defined.
388 *
389 * \sa _math_init().
390 */
391 static void
392 one_time_init( GLcontext *ctx )
393 {
394 static GLboolean alreadyCalled = GL_FALSE;
395 (void) ctx;
396 _glthread_LOCK_MUTEX(OneTimeLock);
397 if (!alreadyCalled) {
398 GLuint i;
399
400 /* do some implementation tests */
401 assert( sizeof(GLbyte) == 1 );
402 assert( sizeof(GLubyte) == 1 );
403 assert( sizeof(GLshort) == 2 );
404 assert( sizeof(GLushort) == 2 );
405 assert( sizeof(GLint) == 4 );
406 assert( sizeof(GLuint) == 4 );
407
408 _mesa_get_cpu_features();
409
410 _mesa_init_sqrt_table();
411
412 for (i = 0; i < 256; i++) {
413 _mesa_ubyte_to_float_color_tab[i] = (float) i / 255.0F;
414 }
415
416 if (_mesa_getenv("MESA_DEBUG")) {
417 _glapi_noop_enable_warnings(GL_TRUE);
418 _glapi_set_warning_func( (_glapi_warning_func) _mesa_warning );
419 }
420 else {
421 _glapi_noop_enable_warnings(GL_FALSE);
422 }
423
424 #if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
425 _mesa_debug(ctx, "Mesa %s DEBUG build %s %s\n",
426 MESA_VERSION_STRING, __DATE__, __TIME__);
427 #endif
428
429 alreadyCalled = GL_TRUE;
430 }
431 _glthread_UNLOCK_MUTEX(OneTimeLock);
432
433 dummy_enum_func();
434 }
435
436
437 /**
438 * Initialize fields of gl_current_attrib (aka ctx->Current.*)
439 */
440 static void
441 _mesa_init_current(GLcontext *ctx)
442 {
443 GLuint i;
444
445 /* Init all to (0,0,0,1) */
446 for (i = 0; i < Elements(ctx->Current.Attrib); i++) {
447 ASSIGN_4V( ctx->Current.Attrib[i], 0.0, 0.0, 0.0, 1.0 );
448 }
449
450 /* redo special cases: */
451 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_WEIGHT], 1.0, 0.0, 0.0, 0.0 );
452 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 1.0 );
453 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 );
454 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR1], 0.0, 0.0, 0.0, 1.0 );
455 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR_INDEX], 1.0, 0.0, 0.0, 1.0 );
456 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_EDGEFLAG], 1.0, 0.0, 0.0, 1.0 );
457 }
458
459
460 /**
461 * Init vertex/fragment program limits.
462 * Important: drivers should override these with actual limits.
463 */
464 static void
465 init_program_limits(GLenum type, struct gl_program_constants *prog)
466 {
467 prog->MaxInstructions = MAX_PROGRAM_INSTRUCTIONS;
468 prog->MaxAluInstructions = MAX_PROGRAM_INSTRUCTIONS;
469 prog->MaxTexInstructions = MAX_PROGRAM_INSTRUCTIONS;
470 prog->MaxTexIndirections = MAX_PROGRAM_INSTRUCTIONS;
471 prog->MaxTemps = MAX_PROGRAM_TEMPS;
472 prog->MaxEnvParams = MAX_PROGRAM_ENV_PARAMS;
473 prog->MaxLocalParams = MAX_PROGRAM_LOCAL_PARAMS;
474 prog->MaxUniformComponents = 4 * MAX_UNIFORMS;
475
476 if (type == GL_VERTEX_PROGRAM_ARB) {
477 prog->MaxParameters = MAX_VERTEX_PROGRAM_PARAMS;
478 prog->MaxAttribs = MAX_NV_VERTEX_PROGRAM_INPUTS;
479 prog->MaxAddressRegs = MAX_VERTEX_PROGRAM_ADDRESS_REGS;
480 }
481 else {
482 prog->MaxParameters = MAX_NV_FRAGMENT_PROGRAM_PARAMS;
483 prog->MaxAttribs = MAX_NV_FRAGMENT_PROGRAM_INPUTS;
484 prog->MaxAddressRegs = MAX_FRAGMENT_PROGRAM_ADDRESS_REGS;
485 }
486
487 /* Set the native limits to zero. This implies that there is no native
488 * support for shaders. Let the drivers fill in the actual values.
489 */
490 prog->MaxNativeInstructions = 0;
491 prog->MaxNativeAluInstructions = 0;
492 prog->MaxNativeTexInstructions = 0;
493 prog->MaxNativeTexIndirections = 0;
494 prog->MaxNativeAttribs = 0;
495 prog->MaxNativeTemps = 0;
496 prog->MaxNativeAddressRegs = 0;
497 prog->MaxNativeParameters = 0;
498 }
499
500
501 /**
502 * Initialize fields of gl_constants (aka ctx->Const.*).
503 * Use defaults from config.h. The device drivers will often override
504 * some of these values (such as number of texture units).
505 */
506 static void
507 _mesa_init_constants(GLcontext *ctx)
508 {
509 assert(ctx);
510
511 assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);
512 assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);
513
514 /* Max texture size should be <= max viewport size (render to texture) */
515 assert((1 << (MAX_TEXTURE_LEVELS - 1)) <= MAX_WIDTH);
516
517 /* Constants, may be overriden (usually only reduced) by device drivers */
518 ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
519 ctx->Const.Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS;
520 ctx->Const.MaxCubeTextureLevels = MAX_CUBE_TEXTURE_LEVELS;
521 ctx->Const.MaxTextureRectSize = MAX_TEXTURE_RECT_SIZE;
522 ctx->Const.MaxArrayTextureLayers = MAX_ARRAY_TEXTURE_LAYERS;
523 ctx->Const.MaxTextureCoordUnits = MAX_TEXTURE_COORD_UNITS;
524 ctx->Const.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
525 ctx->Const.MaxTextureUnits = MIN2(ctx->Const.MaxTextureCoordUnits,
526 ctx->Const.MaxTextureImageUnits);
527 ctx->Const.MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY;
528 ctx->Const.MaxTextureLodBias = MAX_TEXTURE_LOD_BIAS;
529 ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
530 ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
531 ctx->Const.MinPointSize = MIN_POINT_SIZE;
532 ctx->Const.MaxPointSize = MAX_POINT_SIZE;
533 ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
534 ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
535 ctx->Const.PointSizeGranularity = (GLfloat) POINT_SIZE_GRANULARITY;
536 ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
537 ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
538 ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
539 ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
540 ctx->Const.LineWidthGranularity = (GLfloat) LINE_WIDTH_GRANULARITY;
541 ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
542 ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
543 ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
544 ctx->Const.MaxClipPlanes = MAX_CLIP_PLANES;
545 ctx->Const.MaxLights = MAX_LIGHTS;
546 ctx->Const.MaxShininess = 128.0;
547 ctx->Const.MaxSpotExponent = 128.0;
548 ctx->Const.MaxViewportWidth = MAX_WIDTH;
549 ctx->Const.MaxViewportHeight = MAX_HEIGHT;
550 #if FEATURE_ARB_vertex_program
551 init_program_limits(GL_VERTEX_PROGRAM_ARB, &ctx->Const.VertexProgram);
552 #endif
553 #if FEATURE_ARB_fragment_program
554 init_program_limits(GL_FRAGMENT_PROGRAM_ARB, &ctx->Const.FragmentProgram);
555 #endif
556 ctx->Const.MaxProgramMatrices = MAX_PROGRAM_MATRICES;
557 ctx->Const.MaxProgramMatrixStackDepth = MAX_PROGRAM_MATRIX_STACK_DEPTH;
558
559 /* CheckArrayBounds is overriden by drivers/x11 for X server */
560 ctx->Const.CheckArrayBounds = GL_FALSE;
561
562 /* GL_ARB_draw_buffers */
563 ctx->Const.MaxDrawBuffers = MAX_DRAW_BUFFERS;
564
565 /* GL_OES_read_format */
566 ctx->Const.ColorReadFormat = GL_RGBA;
567 ctx->Const.ColorReadType = GL_UNSIGNED_BYTE;
568
569 #if FEATURE_EXT_framebuffer_object
570 ctx->Const.MaxColorAttachments = MAX_COLOR_ATTACHMENTS;
571 ctx->Const.MaxRenderbufferSize = MAX_WIDTH;
572 #endif
573
574 #if FEATURE_ARB_vertex_shader
575 ctx->Const.MaxVertexTextureImageUnits = MAX_VERTEX_TEXTURE_IMAGE_UNITS;
576 ctx->Const.MaxVarying = MAX_VARYING;
577 #endif
578
579 /* GL_ARB_framebuffer_object */
580 ctx->Const.MaxSamples = 0;
581
582 /* GL_ARB_sync */
583 ctx->Const.MaxServerWaitTimeout = (GLuint64) ~0;
584
585 /* GL_ATI_envmap_bumpmap */
586 ctx->Const.SupportedBumpUnits = SUPPORTED_ATI_BUMP_UNITS;
587
588 /* GL_EXT_provoking_vertex */
589 ctx->Const.QuadsFollowProvokingVertexConvention = GL_TRUE;
590
591 /* sanity checks */
592 ASSERT(ctx->Const.MaxTextureUnits == MIN2(ctx->Const.MaxTextureImageUnits,
593 ctx->Const.MaxTextureCoordUnits));
594 ASSERT(ctx->Const.FragmentProgram.MaxLocalParams <= MAX_PROGRAM_LOCAL_PARAMS);
595 ASSERT(ctx->Const.VertexProgram.MaxLocalParams <= MAX_PROGRAM_LOCAL_PARAMS);
596
597 ASSERT(MAX_NV_FRAGMENT_PROGRAM_TEMPS <= MAX_PROGRAM_TEMPS);
598 ASSERT(MAX_NV_VERTEX_PROGRAM_TEMPS <= MAX_PROGRAM_TEMPS);
599 ASSERT(MAX_NV_VERTEX_PROGRAM_INPUTS <= VERT_ATTRIB_MAX);
600 ASSERT(MAX_NV_VERTEX_PROGRAM_OUTPUTS <= VERT_RESULT_MAX);
601
602 /* check that we don't exceed various 32-bit bitfields */
603 ASSERT(VERT_RESULT_MAX <= 32);
604 ASSERT(FRAG_ATTRIB_MAX <= 32);
605 }
606
607
608 /**
609 * Do some sanity checks on the limits/constants for the given context.
610 * Only called the first time a context is bound.
611 */
612 static void
613 check_context_limits(GLcontext *ctx)
614 {
615 /* Many context limits/constants are limited by the size of
616 * internal arrays.
617 */
618 assert(ctx->Const.MaxTextureImageUnits <= MAX_TEXTURE_IMAGE_UNITS);
619 assert(ctx->Const.MaxTextureCoordUnits <= MAX_TEXTURE_COORD_UNITS);
620 assert(ctx->Const.MaxTextureUnits <= MAX_TEXTURE_IMAGE_UNITS);
621 assert(ctx->Const.MaxTextureUnits <= MAX_TEXTURE_COORD_UNITS);
622
623 /* number of coord units cannot be greater than number of image units */
624 assert(ctx->Const.MaxTextureCoordUnits <= ctx->Const.MaxTextureImageUnits);
625
626 assert(ctx->Const.MaxTextureLevels <= MAX_TEXTURE_LEVELS);
627 assert(ctx->Const.Max3DTextureLevels <= MAX_3D_TEXTURE_LEVELS);
628 assert(ctx->Const.MaxCubeTextureLevels <= MAX_CUBE_TEXTURE_LEVELS);
629 assert(ctx->Const.MaxTextureRectSize <= MAX_TEXTURE_RECT_SIZE);
630
631 /* make sure largest texture image is <= MAX_WIDTH in size */
632 assert((1 << (ctx->Const.MaxTextureLevels - 1)) <= MAX_WIDTH);
633 assert((1 << (ctx->Const.MaxCubeTextureLevels - 1)) <= MAX_WIDTH);
634 assert((1 << (ctx->Const.Max3DTextureLevels - 1)) <= MAX_WIDTH);
635
636 assert(ctx->Const.MaxViewportWidth <= MAX_WIDTH);
637 assert(ctx->Const.MaxViewportHeight <= MAX_WIDTH);
638
639 assert(ctx->Const.MaxDrawBuffers <= MAX_DRAW_BUFFERS);
640
641 /* XXX probably add more tests */
642 }
643
644
645 /**
646 * Initialize the attribute groups in a GL context.
647 *
648 * \param ctx GL context.
649 *
650 * Initializes all the attributes, calling the respective <tt>init*</tt>
651 * functions for the more complex data structures.
652 */
653 static GLboolean
654 init_attrib_groups(GLcontext *ctx)
655 {
656 assert(ctx);
657
658 /* Constants */
659 _mesa_init_constants( ctx );
660
661 /* Extensions */
662 _mesa_init_extensions( ctx );
663
664 /* Attribute Groups */
665 _mesa_init_accum( ctx );
666 _mesa_init_attrib( ctx );
667 _mesa_init_buffer_objects( ctx );
668 _mesa_init_color( ctx );
669 _mesa_init_colortables( ctx );
670 _mesa_init_current( ctx );
671 _mesa_init_depth( ctx );
672 _mesa_init_debug( ctx );
673 #if FEATURE_dlist
674 _mesa_init_display_list( ctx );
675 #endif
676 _mesa_init_eval( ctx );
677 _mesa_init_fbobjects( ctx );
678 _mesa_init_feedback( ctx );
679 _mesa_init_fog( ctx );
680 _mesa_init_histogram( ctx );
681 _mesa_init_hint( ctx );
682 _mesa_init_line( ctx );
683 _mesa_init_lighting( ctx );
684 _mesa_init_matrix( ctx );
685 _mesa_init_multisample( ctx );
686 _mesa_init_pixel( ctx );
687 _mesa_init_pixelstore( ctx );
688 _mesa_init_point( ctx );
689 _mesa_init_polygon( ctx );
690 _mesa_init_program( ctx );
691 _mesa_init_queryobj( ctx );
692 #if FEATURE_ARB_sync
693 _mesa_init_sync( ctx );
694 #endif
695 _mesa_init_rastpos( ctx );
696 _mesa_init_scissor( ctx );
697 _mesa_init_shader_state( ctx );
698 _mesa_init_stencil( ctx );
699 _mesa_init_transform( ctx );
700 _mesa_init_varray( ctx );
701 _mesa_init_viewport( ctx );
702
703 if (!_mesa_init_texture( ctx ))
704 return GL_FALSE;
705
706 #if FEATURE_texture_s3tc
707 _mesa_init_texture_s3tc( ctx );
708 #endif
709 #if FEATURE_texture_fxt1
710 _mesa_init_texture_fxt1( ctx );
711 #endif
712
713 /* Miscellaneous */
714 ctx->NewState = _NEW_ALL;
715 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
716 ctx->varying_vp_inputs = ~0;
717
718 return GL_TRUE;
719 }
720
721
722 /**
723 * Update default objects in a GL context with respect to shared state.
724 *
725 * \param ctx GL context.
726 *
727 * Removes references to old default objects, (texture objects, program
728 * objects, etc.) and changes to reference those from the current shared
729 * state.
730 */
731 static GLboolean
732 update_default_objects(GLcontext *ctx)
733 {
734 assert(ctx);
735
736 _mesa_update_default_objects_program(ctx);
737 _mesa_update_default_objects_texture(ctx);
738 _mesa_update_default_objects_buffer_objects(ctx);
739
740 return GL_TRUE;
741 }
742
743
744 /**
745 * This is the default function we plug into all dispatch table slots
746 * This helps prevents a segfault when someone calls a GL function without
747 * first checking if the extension's supported.
748 */
749 static int
750 generic_nop(void)
751 {
752 _mesa_warning(NULL, "User called no-op dispatch function (an unsupported extension function?)");
753 return 0;
754 }
755
756
757 /**
758 * Allocate and initialize a new dispatch table.
759 */
760 static struct _glapi_table *
761 alloc_dispatch_table(void)
762 {
763 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
764 * In practice, this'll be the same for stand-alone Mesa. But for DRI
765 * Mesa we do this to accomodate different versions of libGL and various
766 * DRI drivers.
767 */
768 GLint numEntries = MAX2(_glapi_get_dispatch_table_size(),
769 sizeof(struct _glapi_table) / sizeof(_glapi_proc));
770 struct _glapi_table *table =
771 (struct _glapi_table *) _mesa_malloc(numEntries * sizeof(_glapi_proc));
772 if (table) {
773 _glapi_proc *entry = (_glapi_proc *) table;
774 GLint i;
775 for (i = 0; i < numEntries; i++) {
776 entry[i] = (_glapi_proc) generic_nop;
777 }
778 }
779 return table;
780 }
781
782
783 /**
784 * Initialize a GLcontext struct (rendering context).
785 *
786 * This includes allocating all the other structs and arrays which hang off of
787 * the context by pointers.
788 * Note that the driver needs to pass in its dd_function_table here since
789 * we need to at least call driverFunctions->NewTextureObject to create the
790 * default texture objects.
791 *
792 * Called by _mesa_create_context().
793 *
794 * Performs the imports and exports callback tables initialization, and
795 * miscellaneous one-time initializations. If no shared context is supplied one
796 * is allocated, and increase its reference count. Setups the GL API dispatch
797 * tables. Initialize the TNL module. Sets the maximum Z buffer depth.
798 * Finally queries the \c MESA_DEBUG and \c MESA_VERBOSE environment variables
799 * for debug flags.
800 *
801 * \param ctx the context to initialize
802 * \param visual describes the visual attributes for this context
803 * \param share_list points to context to share textures, display lists,
804 * etc with, or NULL
805 * \param driverFunctions table of device driver functions for this context
806 * to use
807 * \param driverContext pointer to driver-specific context data
808 */
809 GLboolean
810 _mesa_initialize_context(GLcontext *ctx,
811 const GLvisual *visual,
812 GLcontext *share_list,
813 const struct dd_function_table *driverFunctions,
814 void *driverContext)
815 {
816 struct gl_shared_state *shared;
817
818 /*ASSERT(driverContext);*/
819 assert(driverFunctions->NewTextureObject);
820 assert(driverFunctions->FreeTexImageData);
821
822 /* misc one-time initializations */
823 one_time_init(ctx);
824
825 ctx->Visual = *visual;
826 ctx->DrawBuffer = NULL;
827 ctx->ReadBuffer = NULL;
828 ctx->WinSysDrawBuffer = NULL;
829 ctx->WinSysReadBuffer = NULL;
830
831 /* Plug in driver functions and context pointer here.
832 * This is important because when we call alloc_shared_state() below
833 * we'll call ctx->Driver.NewTextureObject() to create the default
834 * textures.
835 */
836 ctx->Driver = *driverFunctions;
837 ctx->DriverCtx = driverContext;
838
839 if (share_list) {
840 /* share state with another context */
841 shared = share_list->Shared;
842 }
843 else {
844 /* allocate new, unshared state */
845 shared = _mesa_alloc_shared_state(ctx);
846 if (!shared)
847 return GL_FALSE;
848 }
849
850 _glthread_LOCK_MUTEX(shared->Mutex);
851 ctx->Shared = shared;
852 shared->RefCount++;
853 _glthread_UNLOCK_MUTEX(shared->Mutex);
854
855 if (!init_attrib_groups( ctx )) {
856 _mesa_free_shared_state(ctx, ctx->Shared);
857 return GL_FALSE;
858 }
859
860 /* setup the API dispatch tables */
861 ctx->Exec = alloc_dispatch_table();
862 ctx->Save = alloc_dispatch_table();
863 if (!ctx->Exec || !ctx->Save) {
864 _mesa_free_shared_state(ctx, ctx->Shared);
865 if (ctx->Exec)
866 _mesa_free(ctx->Exec);
867 }
868 #if FEATURE_dispatch
869 _mesa_init_exec_table(ctx->Exec);
870 #endif
871 ctx->CurrentDispatch = ctx->Exec;
872 #if FEATURE_dlist
873 _mesa_init_dlist_table(ctx->Save);
874 _mesa_install_save_vtxfmt( ctx, &ctx->ListState.ListVtxfmt );
875 #endif
876 /* Neutral tnl module stuff */
877 _mesa_init_exec_vtxfmt( ctx );
878 ctx->TnlModule.Current = NULL;
879 ctx->TnlModule.SwapCount = 0;
880
881 ctx->FragmentProgram._MaintainTexEnvProgram
882 = (_mesa_getenv("MESA_TEX_PROG") != NULL);
883
884 ctx->VertexProgram._MaintainTnlProgram
885 = (_mesa_getenv("MESA_TNL_PROG") != NULL);
886 if (ctx->VertexProgram._MaintainTnlProgram) {
887 /* this is required... */
888 ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
889 }
890
891 #ifdef FEATURE_extra_context_init
892 _mesa_initialize_context_extra(ctx);
893 #endif
894
895 ctx->FirstTimeCurrent = GL_TRUE;
896
897 return GL_TRUE;
898 }
899
900
901 /**
902 * Allocate and initialize a GLcontext structure.
903 * Note that the driver needs to pass in its dd_function_table here since
904 * we need to at least call driverFunctions->NewTextureObject to initialize
905 * the rendering context.
906 *
907 * \param visual a GLvisual pointer (we copy the struct contents)
908 * \param share_list another context to share display lists with or NULL
909 * \param driverFunctions points to the dd_function_table into which the
910 * driver has plugged in all its special functions.
911 * \param driverContext points to the device driver's private context state
912 *
913 * \return pointer to a new __GLcontextRec or NULL if error.
914 */
915 GLcontext *
916 _mesa_create_context(const GLvisual *visual,
917 GLcontext *share_list,
918 const struct dd_function_table *driverFunctions,
919 void *driverContext)
920 {
921 GLcontext *ctx;
922
923 ASSERT(visual);
924 /*ASSERT(driverContext);*/
925
926 ctx = (GLcontext *) _mesa_calloc(sizeof(GLcontext));
927 if (!ctx)
928 return NULL;
929
930 if (_mesa_initialize_context(ctx, visual, share_list,
931 driverFunctions, driverContext)) {
932 return ctx;
933 }
934 else {
935 _mesa_free(ctx);
936 return NULL;
937 }
938 }
939
940
941 /**
942 * Free the data associated with the given context.
943 *
944 * But doesn't free the GLcontext struct itself.
945 *
946 * \sa _mesa_initialize_context() and init_attrib_groups().
947 */
948 void
949 _mesa_free_context_data( GLcontext *ctx )
950 {
951 GLint RefCount;
952
953 if (!_mesa_get_current_context()){
954 /* No current context, but we may need one in order to delete
955 * texture objs, etc. So temporarily bind the context now.
956 */
957 _mesa_make_current(ctx, NULL, NULL);
958 }
959
960 /* unreference WinSysDraw/Read buffers */
961 _mesa_reference_framebuffer(&ctx->WinSysDrawBuffer, NULL);
962 _mesa_reference_framebuffer(&ctx->WinSysReadBuffer, NULL);
963 _mesa_reference_framebuffer(&ctx->DrawBuffer, NULL);
964 _mesa_reference_framebuffer(&ctx->ReadBuffer, NULL);
965
966 _mesa_reference_vertprog(ctx, &ctx->VertexProgram.Current, NULL);
967 _mesa_reference_vertprog(ctx, &ctx->VertexProgram._Current, NULL);
968 _mesa_reference_vertprog(ctx, &ctx->VertexProgram._TnlProgram, NULL);
969
970 _mesa_reference_fragprog(ctx, &ctx->FragmentProgram.Current, NULL);
971 _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current, NULL);
972 _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._TexEnvProgram, NULL);
973
974 _mesa_free_attrib_data(ctx);
975 _mesa_free_lighting_data( ctx );
976 _mesa_free_eval_data( ctx );
977 _mesa_free_texture_data( ctx );
978 _mesa_free_matrix_data( ctx );
979 _mesa_free_viewport_data( ctx );
980 _mesa_free_colortables_data( ctx );
981 _mesa_free_program_data(ctx);
982 _mesa_free_shader_state(ctx);
983 _mesa_free_queryobj_data(ctx);
984 #if FEATURE_ARB_sync
985 _mesa_free_sync_data(ctx);
986 #endif
987 _mesa_free_varray_data(ctx);
988
989 _mesa_delete_array_object(ctx, ctx->Array.DefaultArrayObj);
990
991 #if FEATURE_ARB_pixel_buffer_object
992 _mesa_reference_buffer_object(ctx, &ctx->Pack.BufferObj, NULL);
993 _mesa_reference_buffer_object(ctx, &ctx->Unpack.BufferObj, NULL);
994 #endif
995
996 #if FEATURE_ARB_vertex_buffer_object
997 _mesa_reference_buffer_object(ctx, &ctx->Array.ArrayBufferObj, NULL);
998 _mesa_reference_buffer_object(ctx, &ctx->Array.ElementArrayBufferObj, NULL);
999 #endif
1000
1001 /* free dispatch tables */
1002 _mesa_free(ctx->Exec);
1003 _mesa_free(ctx->Save);
1004
1005 /* Shared context state (display lists, textures, etc) */
1006 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
1007 RefCount = --ctx->Shared->RefCount;
1008 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1009 assert(RefCount >= 0);
1010 if (RefCount == 0) {
1011 /* free shared state */
1012 _mesa_free_shared_state( ctx, ctx->Shared );
1013 }
1014
1015 if (ctx->Extensions.String)
1016 _mesa_free((void *) ctx->Extensions.String);
1017
1018 /* unbind the context if it's currently bound */
1019 if (ctx == _mesa_get_current_context()) {
1020 _mesa_make_current(NULL, NULL, NULL);
1021 }
1022 }
1023
1024
1025 /**
1026 * Destroy a GLcontext structure.
1027 *
1028 * \param ctx GL context.
1029 *
1030 * Calls _mesa_free_context_data() and frees the GLcontext structure itself.
1031 */
1032 void
1033 _mesa_destroy_context( GLcontext *ctx )
1034 {
1035 if (ctx) {
1036 _mesa_free_context_data(ctx);
1037 _mesa_free( (void *) ctx );
1038 }
1039 }
1040
1041
1042 #if _HAVE_FULL_GL
1043 /**
1044 * Copy attribute groups from one context to another.
1045 *
1046 * \param src source context
1047 * \param dst destination context
1048 * \param mask bitwise OR of GL_*_BIT flags
1049 *
1050 * According to the bits specified in \p mask, copies the corresponding
1051 * attributes from \p src into \p dst. For many of the attributes a simple \c
1052 * memcpy is not enough due to the existence of internal pointers in their data
1053 * structures.
1054 */
1055 void
1056 _mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
1057 {
1058 if (mask & GL_ACCUM_BUFFER_BIT) {
1059 /* OK to memcpy */
1060 dst->Accum = src->Accum;
1061 }
1062 if (mask & GL_COLOR_BUFFER_BIT) {
1063 /* OK to memcpy */
1064 dst->Color = src->Color;
1065 }
1066 if (mask & GL_CURRENT_BIT) {
1067 /* OK to memcpy */
1068 dst->Current = src->Current;
1069 }
1070 if (mask & GL_DEPTH_BUFFER_BIT) {
1071 /* OK to memcpy */
1072 dst->Depth = src->Depth;
1073 }
1074 if (mask & GL_ENABLE_BIT) {
1075 /* no op */
1076 }
1077 if (mask & GL_EVAL_BIT) {
1078 /* OK to memcpy */
1079 dst->Eval = src->Eval;
1080 }
1081 if (mask & GL_FOG_BIT) {
1082 /* OK to memcpy */
1083 dst->Fog = src->Fog;
1084 }
1085 if (mask & GL_HINT_BIT) {
1086 /* OK to memcpy */
1087 dst->Hint = src->Hint;
1088 }
1089 if (mask & GL_LIGHTING_BIT) {
1090 GLuint i;
1091 /* begin with memcpy */
1092 dst->Light = src->Light;
1093 /* fixup linked lists to prevent pointer insanity */
1094 make_empty_list( &(dst->Light.EnabledList) );
1095 for (i = 0; i < MAX_LIGHTS; i++) {
1096 if (dst->Light.Light[i].Enabled) {
1097 insert_at_tail(&(dst->Light.EnabledList), &(dst->Light.Light[i]));
1098 }
1099 }
1100 }
1101 if (mask & GL_LINE_BIT) {
1102 /* OK to memcpy */
1103 dst->Line = src->Line;
1104 }
1105 if (mask & GL_LIST_BIT) {
1106 /* OK to memcpy */
1107 dst->List = src->List;
1108 }
1109 if (mask & GL_PIXEL_MODE_BIT) {
1110 /* OK to memcpy */
1111 dst->Pixel = src->Pixel;
1112 }
1113 if (mask & GL_POINT_BIT) {
1114 /* OK to memcpy */
1115 dst->Point = src->Point;
1116 }
1117 if (mask & GL_POLYGON_BIT) {
1118 /* OK to memcpy */
1119 dst->Polygon = src->Polygon;
1120 }
1121 if (mask & GL_POLYGON_STIPPLE_BIT) {
1122 /* Use loop instead of MEMCPY due to problem with Portland Group's
1123 * C compiler. Reported by John Stone.
1124 */
1125 GLuint i;
1126 for (i = 0; i < 32; i++) {
1127 dst->PolygonStipple[i] = src->PolygonStipple[i];
1128 }
1129 }
1130 if (mask & GL_SCISSOR_BIT) {
1131 /* OK to memcpy */
1132 dst->Scissor = src->Scissor;
1133 }
1134 if (mask & GL_STENCIL_BUFFER_BIT) {
1135 /* OK to memcpy */
1136 dst->Stencil = src->Stencil;
1137 }
1138 if (mask & GL_TEXTURE_BIT) {
1139 /* Cannot memcpy because of pointers */
1140 _mesa_copy_texture_state(src, dst);
1141 }
1142 if (mask & GL_TRANSFORM_BIT) {
1143 /* OK to memcpy */
1144 dst->Transform = src->Transform;
1145 }
1146 if (mask & GL_VIEWPORT_BIT) {
1147 /* Cannot use memcpy, because of pointers in GLmatrix _WindowMap */
1148 dst->Viewport.X = src->Viewport.X;
1149 dst->Viewport.Y = src->Viewport.Y;
1150 dst->Viewport.Width = src->Viewport.Width;
1151 dst->Viewport.Height = src->Viewport.Height;
1152 dst->Viewport.Near = src->Viewport.Near;
1153 dst->Viewport.Far = src->Viewport.Far;
1154 _math_matrix_copy(&dst->Viewport._WindowMap, &src->Viewport._WindowMap);
1155 }
1156
1157 /* XXX FIXME: Call callbacks?
1158 */
1159 dst->NewState = _NEW_ALL;
1160 }
1161 #endif
1162
1163
1164 /**
1165 * Check if the given context can render into the given framebuffer
1166 * by checking visual attributes.
1167 *
1168 * Most of these tests could go away because Mesa is now pretty flexible
1169 * in terms of mixing rendering contexts with framebuffers. As long
1170 * as RGB vs. CI mode agree, we're probably good.
1171 *
1172 * \return GL_TRUE if compatible, GL_FALSE otherwise.
1173 */
1174 static GLboolean
1175 check_compatible(const GLcontext *ctx, const GLframebuffer *buffer)
1176 {
1177 const GLvisual *ctxvis = &ctx->Visual;
1178 const GLvisual *bufvis = &buffer->Visual;
1179
1180 if (ctxvis == bufvis)
1181 return GL_TRUE;
1182
1183 if (ctxvis->rgbMode != bufvis->rgbMode)
1184 return GL_FALSE;
1185 #if 0
1186 /* disabling this fixes the fgl_glxgears pbuffer demo */
1187 if (ctxvis->doubleBufferMode && !bufvis->doubleBufferMode)
1188 return GL_FALSE;
1189 #endif
1190 if (ctxvis->stereoMode && !bufvis->stereoMode)
1191 return GL_FALSE;
1192 if (ctxvis->haveAccumBuffer && !bufvis->haveAccumBuffer)
1193 return GL_FALSE;
1194 if (ctxvis->haveDepthBuffer && !bufvis->haveDepthBuffer)
1195 return GL_FALSE;
1196 if (ctxvis->haveStencilBuffer && !bufvis->haveStencilBuffer)
1197 return GL_FALSE;
1198 if (ctxvis->redMask && ctxvis->redMask != bufvis->redMask)
1199 return GL_FALSE;
1200 if (ctxvis->greenMask && ctxvis->greenMask != bufvis->greenMask)
1201 return GL_FALSE;
1202 if (ctxvis->blueMask && ctxvis->blueMask != bufvis->blueMask)
1203 return GL_FALSE;
1204 #if 0
1205 /* disabled (see bug 11161) */
1206 if (ctxvis->depthBits && ctxvis->depthBits != bufvis->depthBits)
1207 return GL_FALSE;
1208 #endif
1209 if (ctxvis->stencilBits && ctxvis->stencilBits != bufvis->stencilBits)
1210 return GL_FALSE;
1211
1212 return GL_TRUE;
1213 }
1214
1215
1216 /**
1217 * Do one-time initialization for the given framebuffer. Specifically,
1218 * ask the driver for the window's current size and update the framebuffer
1219 * object to match.
1220 * Really, the device driver should totally take care of this.
1221 */
1222 static void
1223 initialize_framebuffer_size(GLcontext *ctx, GLframebuffer *fb)
1224 {
1225 GLuint width, height;
1226 if (ctx->Driver.GetBufferSize) {
1227 ctx->Driver.GetBufferSize(fb, &width, &height);
1228 if (ctx->Driver.ResizeBuffers)
1229 ctx->Driver.ResizeBuffers(ctx, fb, width, height);
1230 fb->Initialized = GL_TRUE;
1231 }
1232 }
1233
1234
1235 /**
1236 * Check if the viewport/scissor size has not yet been initialized.
1237 * Initialize the size if the given width and height are non-zero.
1238 */
1239 void
1240 _mesa_check_init_viewport(GLcontext *ctx, GLuint width, GLuint height)
1241 {
1242 if (!ctx->ViewportInitialized && width > 0 && height > 0) {
1243 /* Note: set flag here, before calling _mesa_set_viewport(), to prevent
1244 * potential infinite recursion.
1245 */
1246 ctx->ViewportInitialized = GL_TRUE;
1247 _mesa_set_viewport(ctx, 0, 0, width, height);
1248 _mesa_set_scissor(ctx, 0, 0, width, height);
1249 }
1250 }
1251
1252
1253 /**
1254 * Bind the given context to the given drawBuffer and readBuffer and
1255 * make it the current context for the calling thread.
1256 * We'll render into the drawBuffer and read pixels from the
1257 * readBuffer (i.e. glRead/CopyPixels, glCopyTexImage, etc).
1258 *
1259 * We check that the context's and framebuffer's visuals are compatible
1260 * and return immediately if they're not.
1261 *
1262 * \param newCtx the new GL context. If NULL then there will be no current GL
1263 * context.
1264 * \param drawBuffer the drawing framebuffer
1265 * \param readBuffer the reading framebuffer
1266 */
1267 GLboolean
1268 _mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer,
1269 GLframebuffer *readBuffer )
1270 {
1271 if (MESA_VERBOSE & VERBOSE_API)
1272 _mesa_debug(newCtx, "_mesa_make_current()\n");
1273
1274 /* Check that the context's and framebuffer's visuals are compatible.
1275 */
1276 if (newCtx && drawBuffer && newCtx->WinSysDrawBuffer != drawBuffer) {
1277 if (!check_compatible(newCtx, drawBuffer)) {
1278 _mesa_warning(newCtx,
1279 "MakeCurrent: incompatible visuals for context and drawbuffer");
1280 return GL_FALSE;
1281 }
1282 }
1283 if (newCtx && readBuffer && newCtx->WinSysReadBuffer != readBuffer) {
1284 if (!check_compatible(newCtx, readBuffer)) {
1285 _mesa_warning(newCtx,
1286 "MakeCurrent: incompatible visuals for context and readbuffer");
1287 return GL_FALSE;
1288 }
1289 }
1290
1291 /* We used to call _glapi_check_multithread() here. Now do it in drivers */
1292 _glapi_set_context((void *) newCtx);
1293 ASSERT(_mesa_get_current_context() == newCtx);
1294
1295 if (!newCtx) {
1296 _glapi_set_dispatch(NULL); /* none current */
1297 }
1298 else {
1299 _glapi_set_dispatch(newCtx->CurrentDispatch);
1300
1301 if (drawBuffer && readBuffer) {
1302 /* TODO: check if newCtx and buffer's visual match??? */
1303
1304 ASSERT(drawBuffer->Name == 0);
1305 ASSERT(readBuffer->Name == 0);
1306 _mesa_reference_framebuffer(&newCtx->WinSysDrawBuffer, drawBuffer);
1307 _mesa_reference_framebuffer(&newCtx->WinSysReadBuffer, readBuffer);
1308
1309 /*
1310 * Only set the context's Draw/ReadBuffer fields if they're NULL
1311 * or not bound to a user-created FBO.
1312 */
1313 if (!newCtx->DrawBuffer || newCtx->DrawBuffer->Name == 0) {
1314 /* KW: merge conflict here, revisit.
1315 */
1316 /* fix up the fb fields - these will end up wrong otherwise
1317 * if the DRIdrawable changes, and everything relies on them.
1318 * This is a bit messy (same as needed in _mesa_BindFramebufferEXT)
1319 */
1320 unsigned int i;
1321 GLenum buffers[MAX_DRAW_BUFFERS];
1322
1323 _mesa_reference_framebuffer(&newCtx->DrawBuffer, drawBuffer);
1324
1325 for(i = 0; i < newCtx->Const.MaxDrawBuffers; i++) {
1326 buffers[i] = newCtx->Color.DrawBuffer[i];
1327 }
1328
1329 _mesa_drawbuffers(newCtx, newCtx->Const.MaxDrawBuffers, buffers, NULL);
1330 }
1331 if (!newCtx->ReadBuffer || newCtx->ReadBuffer->Name == 0) {
1332 _mesa_reference_framebuffer(&newCtx->ReadBuffer, readBuffer);
1333 }
1334
1335 /* XXX only set this flag if we're really changing the draw/read
1336 * framebuffer bindings.
1337 */
1338 newCtx->NewState |= _NEW_BUFFERS;
1339
1340 #if 1
1341 /* We want to get rid of these lines: */
1342
1343 #if _HAVE_FULL_GL
1344 if (!drawBuffer->Initialized) {
1345 initialize_framebuffer_size(newCtx, drawBuffer);
1346 }
1347 if (readBuffer != drawBuffer && !readBuffer->Initialized) {
1348 initialize_framebuffer_size(newCtx, readBuffer);
1349 }
1350
1351 _mesa_resizebuffers(newCtx);
1352 #endif
1353
1354 #else
1355 /* We want the drawBuffer and readBuffer to be initialized by
1356 * the driver.
1357 * This generally means the Width and Height match the actual
1358 * window size and the renderbuffers (both hardware and software
1359 * based) are allocated to match. The later can generally be
1360 * done with a call to _mesa_resize_framebuffer().
1361 *
1362 * It's theoretically possible for a buffer to have zero width
1363 * or height, but for now, assert check that the driver did what's
1364 * expected of it.
1365 */
1366 ASSERT(drawBuffer->Width > 0);
1367 ASSERT(drawBuffer->Height > 0);
1368 #endif
1369
1370 if (drawBuffer) {
1371 _mesa_check_init_viewport(newCtx,
1372 drawBuffer->Width, drawBuffer->Height);
1373 }
1374 }
1375
1376 if (newCtx->FirstTimeCurrent) {
1377 check_context_limits(newCtx);
1378
1379 /* We can use this to help debug user's problems. Tell them to set
1380 * the MESA_INFO env variable before running their app. Then the
1381 * first time each context is made current we'll print some useful
1382 * information.
1383 */
1384 if (_mesa_getenv("MESA_INFO")) {
1385 _mesa_print_info();
1386 }
1387
1388 newCtx->FirstTimeCurrent = GL_FALSE;
1389 }
1390 }
1391
1392 return GL_TRUE;
1393 }
1394
1395
1396 /**
1397 * Make context 'ctx' share the display lists, textures and programs
1398 * that are associated with 'ctxToShare'.
1399 * Any display lists, textures or programs associated with 'ctx' will
1400 * be deleted if nobody else is sharing them.
1401 */
1402 GLboolean
1403 _mesa_share_state(GLcontext *ctx, GLcontext *ctxToShare)
1404 {
1405 if (ctx && ctxToShare && ctx->Shared && ctxToShare->Shared) {
1406 struct gl_shared_state *oldSharedState = ctx->Shared;
1407 GLint RefCount;
1408
1409 ctx->Shared = ctxToShare->Shared;
1410
1411 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
1412 ctx->Shared->RefCount++;
1413 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1414
1415 update_default_objects(ctx);
1416
1417 _glthread_LOCK_MUTEX(oldSharedState->Mutex);
1418 RefCount = --oldSharedState->RefCount;
1419 _glthread_UNLOCK_MUTEX(oldSharedState->Mutex);
1420
1421 if (RefCount == 0) {
1422 _mesa_free_shared_state(ctx, oldSharedState);
1423 }
1424
1425 return GL_TRUE;
1426 }
1427 else {
1428 return GL_FALSE;
1429 }
1430 }
1431
1432
1433
1434 /**
1435 * \return pointer to the current GL context for this thread.
1436 *
1437 * Calls _glapi_get_context(). This isn't the fastest way to get the current
1438 * context. If you need speed, see the #GET_CURRENT_CONTEXT macro in
1439 * context.h.
1440 */
1441 GLcontext *
1442 _mesa_get_current_context( void )
1443 {
1444 return (GLcontext *) _glapi_get_context();
1445 }
1446
1447
1448 /**
1449 * Get context's current API dispatch table.
1450 *
1451 * It'll either be the immediate-mode execute dispatcher or the display list
1452 * compile dispatcher.
1453 *
1454 * \param ctx GL context.
1455 *
1456 * \return pointer to dispatch_table.
1457 *
1458 * Simply returns __GLcontextRec::CurrentDispatch.
1459 */
1460 struct _glapi_table *
1461 _mesa_get_dispatch(GLcontext *ctx)
1462 {
1463 return ctx->CurrentDispatch;
1464 }
1465
1466 /*@}*/
1467
1468
1469 /**********************************************************************/
1470 /** \name Miscellaneous functions */
1471 /**********************************************************************/
1472 /*@{*/
1473
1474 /**
1475 * Record an error.
1476 *
1477 * \param ctx GL context.
1478 * \param error error code.
1479 *
1480 * Records the given error code and call the driver's dd_function_table::Error
1481 * function if defined.
1482 *
1483 * \sa
1484 * This is called via _mesa_error().
1485 */
1486 void
1487 _mesa_record_error(GLcontext *ctx, GLenum error)
1488 {
1489 if (!ctx)
1490 return;
1491
1492 if (ctx->ErrorValue == GL_NO_ERROR) {
1493 ctx->ErrorValue = error;
1494 }
1495
1496 /* Call device driver's error handler, if any. This is used on the Mac. */
1497 if (ctx->Driver.Error) {
1498 ctx->Driver.Error(ctx);
1499 }
1500 }
1501
1502
1503 /**
1504 * Execute glFinish().
1505 *
1506 * Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the
1507 * dd_function_table::Finish driver callback, if not NULL.
1508 */
1509 void GLAPIENTRY
1510 _mesa_Finish(void)
1511 {
1512 GET_CURRENT_CONTEXT(ctx);
1513 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1514 FLUSH_CURRENT( ctx, 0 );
1515 if (ctx->Driver.Finish) {
1516 ctx->Driver.Finish(ctx);
1517 }
1518 }
1519
1520
1521 /**
1522 * Execute glFlush().
1523 *
1524 * Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the
1525 * dd_function_table::Flush driver callback, if not NULL.
1526 */
1527 void GLAPIENTRY
1528 _mesa_Flush(void)
1529 {
1530 GET_CURRENT_CONTEXT(ctx);
1531 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1532 FLUSH_CURRENT( ctx, 0 );
1533 if (ctx->Driver.Flush) {
1534 ctx->Driver.Flush(ctx);
1535 }
1536 }
1537
1538
1539 /**
1540 * Set mvp_with_dp4 flag. If a driver has a preference for DP4 over
1541 * MUL/MAD, or vice versa, call this function to register that.
1542 * Otherwise we default to MUL/MAD.
1543 */
1544 void
1545 _mesa_set_mvp_with_dp4( GLcontext *ctx,
1546 GLboolean flag )
1547 {
1548 ctx->mvp_with_dp4 = flag;
1549 }
1550
1551
1552
1553 /**
1554 * Prior to drawing anything with glBegin, glDrawArrays, etc. this function
1555 * is called to see if it's valid to render. This involves checking that
1556 * the current shader is valid and the framebuffer is complete.
1557 * If an error is detected it'll be recorded here.
1558 * \return GL_TRUE if OK to render, GL_FALSE if not
1559 */
1560 GLboolean
1561 _mesa_valid_to_render(GLcontext *ctx, const char *where)
1562 {
1563 if (ctx->Shader.CurrentProgram) {
1564 /* using shaders */
1565 if (!ctx->Shader.CurrentProgram->LinkStatus) {
1566 _mesa_error(ctx, GL_INVALID_OPERATION,
1567 "%s(shader not linked), where");
1568 return GL_FALSE;
1569 }
1570 #if 0 /* not normally enabled */
1571 {
1572 char errMsg[100];
1573 if (!_mesa_validate_shader_program(ctx, ctx->Shader.CurrentProgram,
1574 errMsg)) {
1575 _mesa_warning(ctx, "Shader program %u is invalid: %s",
1576 ctx->Shader.CurrentProgram->Name, errMsg);
1577 }
1578 }
1579 #endif
1580 }
1581 else {
1582 if (ctx->VertexProgram.Enabled && !ctx->VertexProgram._Enabled) {
1583 _mesa_error(ctx, GL_INVALID_OPERATION,
1584 "%s(vertex program not valid)", where);
1585 return GL_FALSE;
1586 }
1587 if (ctx->FragmentProgram.Enabled && !ctx->FragmentProgram._Enabled) {
1588 _mesa_error(ctx, GL_INVALID_OPERATION,
1589 "%s(fragment program not valid)", where);
1590 return GL_FALSE;
1591 }
1592 }
1593
1594 if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
1595 _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
1596 "%s(incomplete framebuffer)", where);
1597 return GL_FALSE;
1598 }
1599
1600 #ifdef DEBUG
1601 if (ctx->Shader.Flags & GLSL_LOG) {
1602 struct gl_shader_program *shProg = ctx->Shader.CurrentProgram;
1603 if (shProg) {
1604 if (!shProg->_Used) {
1605 /* This is the first time this shader is being used.
1606 * Append shader's constants/uniforms to log file.
1607 */
1608 GLuint i;
1609 for (i = 0; i < shProg->NumShaders; i++) {
1610 struct gl_shader *sh = shProg->Shaders[i];
1611 if (sh->Type == GL_VERTEX_SHADER) {
1612 _mesa_append_uniforms_to_file(sh,
1613 &shProg->VertexProgram->Base);
1614 }
1615 else if (sh->Type == GL_FRAGMENT_SHADER) {
1616 _mesa_append_uniforms_to_file(sh,
1617 &shProg->FragmentProgram->Base);
1618 }
1619 }
1620 shProg->_Used = GL_TRUE;
1621 }
1622 }
1623 }
1624 #endif
1625
1626 return GL_TRUE;
1627 }
1628
1629
1630 /*@}*/