context.c revision 4a49301e
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#include "dlist.h" 95#include "eval.h" 96#include "enums.h" 97#include "extensions.h" 98#include "fbobject.h" 99#include "feedback.h" 100#include "fog.h" 101#include "framebuffer.h" 102#include "get.h" 103#include "histogram.h" 104#include "hint.h" 105#include "hash.h" 106#include "light.h" 107#include "lines.h" 108#include "macros.h" 109#include "matrix.h" 110#include "multisample.h" 111#include "pixel.h" 112#include "pixelstore.h" 113#include "points.h" 114#include "polygon.h" 115#include "queryobj.h" 116#if FEATURE_ARB_sync 117#include "syncobj.h" 118#endif 119#include "rastpos.h" 120#include "remap.h" 121#include "scissor.h" 122#include "shared.h" 123#include "simple_list.h" 124#include "state.h" 125#include "stencil.h" 126#include "texcompress_s3tc.h" 127#include "teximage.h" 128#include "texobj.h" 129#include "texstate.h" 130#include "mtypes.h" 131#include "varray.h" 132#include "version.h" 133#include "viewport.h" 134#include "vtxfmt.h" 135#include "glapi/glthread.h" 136#include "glapi/glapitable.h" 137#include "shader/program.h" 138#include "shader/prog_print.h" 139#include "shader/shader_api.h" 140#if FEATURE_ATI_fragment_shader 141#include "shader/atifragshader.h" 142#endif 143#if _HAVE_FULL_GL 144#include "math/m_matrix.h" 145#endif 146 147#ifdef USE_SPARC_ASM 148#include "sparc/sparc.h" 149#endif 150 151#ifndef MESA_VERBOSE 152int MESA_VERBOSE = 0; 153#endif 154 155#ifndef MESA_DEBUG_FLAGS 156int MESA_DEBUG_FLAGS = 0; 157#endif 158 159 160/* ubyte -> float conversion */ 161GLfloat _mesa_ubyte_to_float_color_tab[256]; 162 163 164 165/** 166 * Swap buffers notification callback. 167 * 168 * \param ctx GL context. 169 * 170 * Called by window system just before swapping buffers. 171 * We have to finish any pending rendering. 172 */ 173void 174_mesa_notifySwapBuffers(__GLcontext *ctx) 175{ 176 if (MESA_VERBOSE & VERBOSE_SWAPBUFFERS) 177 _mesa_debug(ctx, "SwapBuffers\n"); 178 FLUSH_CURRENT( ctx, 0 ); 179 if (ctx->Driver.Flush) { 180 ctx->Driver.Flush(ctx); 181 } 182} 183 184 185/**********************************************************************/ 186/** \name GL Visual allocation/destruction */ 187/**********************************************************************/ 188/*@{*/ 189 190/** 191 * Allocates a 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 */ 215GLvisual * 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 */ 256GLboolean 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 */ 327void 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 */ 352static void 353dummy_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 */ 391static void 392one_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_remap_table(); 411 412 _mesa_init_sqrt_table(); 413 414 for (i = 0; i < 256; i++) { 415 _mesa_ubyte_to_float_color_tab[i] = (float) i / 255.0F; 416 } 417 418 if (_mesa_getenv("MESA_DEBUG")) { 419 _glapi_noop_enable_warnings(GL_TRUE); 420 _glapi_set_warning_func( (_glapi_warning_func) _mesa_warning ); 421 } 422 else { 423 _glapi_noop_enable_warnings(GL_FALSE); 424 } 425 426#if defined(DEBUG) && defined(__DATE__) && defined(__TIME__) 427 _mesa_debug(ctx, "Mesa %s DEBUG build %s %s\n", 428 MESA_VERSION_STRING, __DATE__, __TIME__); 429#endif 430 431 alreadyCalled = GL_TRUE; 432 } 433 _glthread_UNLOCK_MUTEX(OneTimeLock); 434 435 dummy_enum_func(); 436} 437 438 439/** 440 * Initialize fields of gl_current_attrib (aka ctx->Current.*) 441 */ 442static void 443_mesa_init_current(GLcontext *ctx) 444{ 445 GLuint i; 446 447 /* Init all to (0,0,0,1) */ 448 for (i = 0; i < Elements(ctx->Current.Attrib); i++) { 449 ASSIGN_4V( ctx->Current.Attrib[i], 0.0, 0.0, 0.0, 1.0 ); 450 } 451 452 /* redo special cases: */ 453 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_WEIGHT], 1.0, 0.0, 0.0, 0.0 ); 454 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 1.0 ); 455 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 ); 456 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR1], 0.0, 0.0, 0.0, 1.0 ); 457 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR_INDEX], 1.0, 0.0, 0.0, 1.0 ); 458 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_EDGEFLAG], 1.0, 0.0, 0.0, 1.0 ); 459} 460 461 462/** 463 * Init vertex/fragment program limits. 464 * Important: drivers should override these with actual limits. 465 */ 466static void 467init_program_limits(GLenum type, struct gl_program_constants *prog) 468{ 469 prog->MaxInstructions = MAX_PROGRAM_INSTRUCTIONS; 470 prog->MaxAluInstructions = MAX_PROGRAM_INSTRUCTIONS; 471 prog->MaxTexInstructions = MAX_PROGRAM_INSTRUCTIONS; 472 prog->MaxTexIndirections = MAX_PROGRAM_INSTRUCTIONS; 473 prog->MaxTemps = MAX_PROGRAM_TEMPS; 474 prog->MaxEnvParams = MAX_PROGRAM_ENV_PARAMS; 475 prog->MaxLocalParams = MAX_PROGRAM_LOCAL_PARAMS; 476 prog->MaxUniformComponents = 4 * MAX_UNIFORMS; 477 478 if (type == GL_VERTEX_PROGRAM_ARB) { 479 prog->MaxParameters = MAX_VERTEX_PROGRAM_PARAMS; 480 prog->MaxAttribs = MAX_NV_VERTEX_PROGRAM_INPUTS; 481 prog->MaxAddressRegs = MAX_VERTEX_PROGRAM_ADDRESS_REGS; 482 } 483 else { 484 prog->MaxParameters = MAX_NV_FRAGMENT_PROGRAM_PARAMS; 485 prog->MaxAttribs = MAX_NV_FRAGMENT_PROGRAM_INPUTS; 486 prog->MaxAddressRegs = MAX_FRAGMENT_PROGRAM_ADDRESS_REGS; 487 } 488 489 /* Set the native limits to zero. This implies that there is no native 490 * support for shaders. Let the drivers fill in the actual values. 491 */ 492 prog->MaxNativeInstructions = 0; 493 prog->MaxNativeAluInstructions = 0; 494 prog->MaxNativeTexInstructions = 0; 495 prog->MaxNativeTexIndirections = 0; 496 prog->MaxNativeAttribs = 0; 497 prog->MaxNativeTemps = 0; 498 prog->MaxNativeAddressRegs = 0; 499 prog->MaxNativeParameters = 0; 500} 501 502 503/** 504 * Initialize fields of gl_constants (aka ctx->Const.*). 505 * Use defaults from config.h. The device drivers will often override 506 * some of these values (such as number of texture units). 507 */ 508static void 509_mesa_init_constants(GLcontext *ctx) 510{ 511 assert(ctx); 512 513 assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS); 514 assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS); 515 516 /* Max texture size should be <= max viewport size (render to texture) */ 517 assert((1 << (MAX_TEXTURE_LEVELS - 1)) <= MAX_WIDTH); 518 519 /* Constants, may be overriden (usually only reduced) by device drivers */ 520 ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS; 521 ctx->Const.Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS; 522 ctx->Const.MaxCubeTextureLevels = MAX_CUBE_TEXTURE_LEVELS; 523 ctx->Const.MaxTextureRectSize = MAX_TEXTURE_RECT_SIZE; 524 ctx->Const.MaxArrayTextureLayers = MAX_ARRAY_TEXTURE_LAYERS; 525 ctx->Const.MaxTextureCoordUnits = MAX_TEXTURE_COORD_UNITS; 526 ctx->Const.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS; 527 ctx->Const.MaxTextureUnits = MIN2(ctx->Const.MaxTextureCoordUnits, 528 ctx->Const.MaxTextureImageUnits); 529 ctx->Const.MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY; 530 ctx->Const.MaxTextureLodBias = MAX_TEXTURE_LOD_BIAS; 531 ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE; 532 ctx->Const.SubPixelBits = SUB_PIXEL_BITS; 533 ctx->Const.MinPointSize = MIN_POINT_SIZE; 534 ctx->Const.MaxPointSize = MAX_POINT_SIZE; 535 ctx->Const.MinPointSizeAA = MIN_POINT_SIZE; 536 ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE; 537 ctx->Const.PointSizeGranularity = (GLfloat) POINT_SIZE_GRANULARITY; 538 ctx->Const.MinLineWidth = MIN_LINE_WIDTH; 539 ctx->Const.MaxLineWidth = MAX_LINE_WIDTH; 540 ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH; 541 ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH; 542 ctx->Const.LineWidthGranularity = (GLfloat) LINE_WIDTH_GRANULARITY; 543 ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE; 544 ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH; 545 ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT; 546 ctx->Const.MaxClipPlanes = MAX_CLIP_PLANES; 547 ctx->Const.MaxLights = MAX_LIGHTS; 548 ctx->Const.MaxShininess = 128.0; 549 ctx->Const.MaxSpotExponent = 128.0; 550 ctx->Const.MaxViewportWidth = MAX_WIDTH; 551 ctx->Const.MaxViewportHeight = MAX_HEIGHT; 552#if FEATURE_ARB_vertex_program 553 init_program_limits(GL_VERTEX_PROGRAM_ARB, &ctx->Const.VertexProgram); 554#endif 555#if FEATURE_ARB_fragment_program 556 init_program_limits(GL_FRAGMENT_PROGRAM_ARB, &ctx->Const.FragmentProgram); 557#endif 558 ctx->Const.MaxProgramMatrices = MAX_PROGRAM_MATRICES; 559 ctx->Const.MaxProgramMatrixStackDepth = MAX_PROGRAM_MATRIX_STACK_DEPTH; 560 561 /* CheckArrayBounds is overriden by drivers/x11 for X server */ 562 ctx->Const.CheckArrayBounds = GL_FALSE; 563 564 /* GL_ARB_draw_buffers */ 565 ctx->Const.MaxDrawBuffers = MAX_DRAW_BUFFERS; 566 567#if FEATURE_EXT_framebuffer_object 568 ctx->Const.MaxColorAttachments = MAX_COLOR_ATTACHMENTS; 569 ctx->Const.MaxRenderbufferSize = MAX_WIDTH; 570#endif 571 572#if FEATURE_ARB_vertex_shader 573 ctx->Const.MaxVertexTextureImageUnits = MAX_VERTEX_TEXTURE_IMAGE_UNITS; 574 ctx->Const.MaxVarying = MAX_VARYING; 575#endif 576 577 /* GL_ARB_framebuffer_object */ 578 ctx->Const.MaxSamples = 0; 579 580 /* GL_ARB_sync */ 581 ctx->Const.MaxServerWaitTimeout = (GLuint64) ~0; 582 583 /* GL_ATI_envmap_bumpmap */ 584 ctx->Const.SupportedBumpUnits = SUPPORTED_ATI_BUMP_UNITS; 585 586 /* GL_EXT_provoking_vertex */ 587 ctx->Const.QuadsFollowProvokingVertexConvention = GL_TRUE; 588 589 /* sanity checks */ 590 ASSERT(ctx->Const.MaxTextureUnits == MIN2(ctx->Const.MaxTextureImageUnits, 591 ctx->Const.MaxTextureCoordUnits)); 592 ASSERT(ctx->Const.FragmentProgram.MaxLocalParams <= MAX_PROGRAM_LOCAL_PARAMS); 593 ASSERT(ctx->Const.VertexProgram.MaxLocalParams <= MAX_PROGRAM_LOCAL_PARAMS); 594 595 ASSERT(MAX_NV_FRAGMENT_PROGRAM_TEMPS <= MAX_PROGRAM_TEMPS); 596 ASSERT(MAX_NV_VERTEX_PROGRAM_TEMPS <= MAX_PROGRAM_TEMPS); 597 ASSERT(MAX_NV_VERTEX_PROGRAM_INPUTS <= VERT_ATTRIB_MAX); 598 ASSERT(MAX_NV_VERTEX_PROGRAM_OUTPUTS <= VERT_RESULT_MAX); 599 600 /* check that we don't exceed the size of various bitfields */ 601 ASSERT(VERT_RESULT_MAX <= 602 (8 * sizeof(ctx->VertexProgram._Current->Base.OutputsWritten))); 603 ASSERT(FRAG_ATTRIB_MAX <= 604 (8 * sizeof(ctx->FragmentProgram._Current->Base.InputsRead))); 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 */ 612static void 613check_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 */ 653static GLboolean 654init_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 _mesa_init_display_list( ctx ); 674 _mesa_init_eval( ctx ); 675 _mesa_init_fbobjects( ctx ); 676 _mesa_init_feedback( ctx ); 677 _mesa_init_fog( ctx ); 678 _mesa_init_histogram( ctx ); 679 _mesa_init_hint( ctx ); 680 _mesa_init_line( ctx ); 681 _mesa_init_lighting( ctx ); 682 _mesa_init_matrix( ctx ); 683 _mesa_init_multisample( ctx ); 684 _mesa_init_pixel( ctx ); 685 _mesa_init_pixelstore( ctx ); 686 _mesa_init_point( ctx ); 687 _mesa_init_polygon( ctx ); 688 _mesa_init_program( ctx ); 689 _mesa_init_queryobj( ctx ); 690#if FEATURE_ARB_sync 691 _mesa_init_sync( ctx ); 692#endif 693 _mesa_init_rastpos( ctx ); 694 _mesa_init_scissor( ctx ); 695 _mesa_init_shader_state( ctx ); 696 _mesa_init_stencil( ctx ); 697 _mesa_init_transform( ctx ); 698 _mesa_init_varray( ctx ); 699 _mesa_init_viewport( ctx ); 700 701 if (!_mesa_init_texture( ctx )) 702 return GL_FALSE; 703 704 _mesa_init_texture_s3tc( ctx ); 705 706 /* Miscellaneous */ 707 ctx->NewState = _NEW_ALL; 708 ctx->ErrorValue = (GLenum) GL_NO_ERROR; 709 ctx->varying_vp_inputs = ~0; 710 711 return GL_TRUE; 712} 713 714 715/** 716 * Update default objects in a GL context with respect to shared state. 717 * 718 * \param ctx GL context. 719 * 720 * Removes references to old default objects, (texture objects, program 721 * objects, etc.) and changes to reference those from the current shared 722 * state. 723 */ 724static GLboolean 725update_default_objects(GLcontext *ctx) 726{ 727 assert(ctx); 728 729 _mesa_update_default_objects_program(ctx); 730 _mesa_update_default_objects_texture(ctx); 731 _mesa_update_default_objects_buffer_objects(ctx); 732 733 return GL_TRUE; 734} 735 736 737/** 738 * This is the default function we plug into all dispatch table slots 739 * This helps prevents a segfault when someone calls a GL function without 740 * first checking if the extension's supported. 741 */ 742static int 743generic_nop(void) 744{ 745 _mesa_warning(NULL, "User called no-op dispatch function (an unsupported extension function?)"); 746 return 0; 747} 748 749 750/** 751 * Allocate and initialize a new dispatch table. 752 */ 753static struct _glapi_table * 754alloc_dispatch_table(void) 755{ 756 /* Find the larger of Mesa's dispatch table and libGL's dispatch table. 757 * In practice, this'll be the same for stand-alone Mesa. But for DRI 758 * Mesa we do this to accomodate different versions of libGL and various 759 * DRI drivers. 760 */ 761 GLint numEntries = MAX2(_glapi_get_dispatch_table_size(), 762 sizeof(struct _glapi_table) / sizeof(_glapi_proc)); 763 struct _glapi_table *table = 764 (struct _glapi_table *) _mesa_malloc(numEntries * sizeof(_glapi_proc)); 765 if (table) { 766 _glapi_proc *entry = (_glapi_proc *) table; 767 GLint i; 768 for (i = 0; i < numEntries; i++) { 769 entry[i] = (_glapi_proc) generic_nop; 770 } 771 } 772 return table; 773} 774 775 776/** 777 * Initialize a GLcontext struct (rendering context). 778 * 779 * This includes allocating all the other structs and arrays which hang off of 780 * the context by pointers. 781 * Note that the driver needs to pass in its dd_function_table here since 782 * we need to at least call driverFunctions->NewTextureObject to create the 783 * default texture objects. 784 * 785 * Called by _mesa_create_context(). 786 * 787 * Performs the imports and exports callback tables initialization, and 788 * miscellaneous one-time initializations. If no shared context is supplied one 789 * is allocated, and increase its reference count. Setups the GL API dispatch 790 * tables. Initialize the TNL module. Sets the maximum Z buffer depth. 791 * Finally queries the \c MESA_DEBUG and \c MESA_VERBOSE environment variables 792 * for debug flags. 793 * 794 * \param ctx the context to initialize 795 * \param visual describes the visual attributes for this context 796 * \param share_list points to context to share textures, display lists, 797 * etc with, or NULL 798 * \param driverFunctions table of device driver functions for this context 799 * to use 800 * \param driverContext pointer to driver-specific context data 801 */ 802GLboolean 803_mesa_initialize_context(GLcontext *ctx, 804 const GLvisual *visual, 805 GLcontext *share_list, 806 const struct dd_function_table *driverFunctions, 807 void *driverContext) 808{ 809 struct gl_shared_state *shared; 810 811 /*ASSERT(driverContext);*/ 812 assert(driverFunctions->NewTextureObject); 813 assert(driverFunctions->FreeTexImageData); 814 815 /* misc one-time initializations */ 816 one_time_init(ctx); 817 818 ctx->Visual = *visual; 819 ctx->DrawBuffer = NULL; 820 ctx->ReadBuffer = NULL; 821 ctx->WinSysDrawBuffer = NULL; 822 ctx->WinSysReadBuffer = NULL; 823 824 /* Plug in driver functions and context pointer here. 825 * This is important because when we call alloc_shared_state() below 826 * we'll call ctx->Driver.NewTextureObject() to create the default 827 * textures. 828 */ 829 ctx->Driver = *driverFunctions; 830 ctx->DriverCtx = driverContext; 831 832 if (share_list) { 833 /* share state with another context */ 834 shared = share_list->Shared; 835 } 836 else { 837 /* allocate new, unshared state */ 838 shared = _mesa_alloc_shared_state(ctx); 839 if (!shared) 840 return GL_FALSE; 841 } 842 843 _glthread_LOCK_MUTEX(shared->Mutex); 844 ctx->Shared = shared; 845 shared->RefCount++; 846 _glthread_UNLOCK_MUTEX(shared->Mutex); 847 848 if (!init_attrib_groups( ctx )) { 849 _mesa_release_shared_state(ctx, ctx->Shared); 850 return GL_FALSE; 851 } 852 853 /* setup the API dispatch tables */ 854 ctx->Exec = alloc_dispatch_table(); 855 ctx->Save = alloc_dispatch_table(); 856 if (!ctx->Exec || !ctx->Save) { 857 _mesa_release_shared_state(ctx, ctx->Shared); 858 if (ctx->Exec) 859 _mesa_free(ctx->Exec); 860 return GL_FALSE; 861 } 862#if FEATURE_dispatch 863 _mesa_init_exec_table(ctx->Exec); 864#endif 865 ctx->CurrentDispatch = ctx->Exec; 866 867#if FEATURE_dlist 868 _mesa_init_save_table(ctx->Save); 869 _mesa_install_save_vtxfmt( ctx, &ctx->ListState.ListVtxfmt ); 870#endif 871 872 /* Neutral tnl module stuff */ 873 _mesa_init_exec_vtxfmt( ctx ); 874 ctx->TnlModule.Current = NULL; 875 ctx->TnlModule.SwapCount = 0; 876 877 ctx->FragmentProgram._MaintainTexEnvProgram 878 = (_mesa_getenv("MESA_TEX_PROG") != NULL); 879 880 ctx->VertexProgram._MaintainTnlProgram 881 = (_mesa_getenv("MESA_TNL_PROG") != NULL); 882 if (ctx->VertexProgram._MaintainTnlProgram) { 883 /* this is required... */ 884 ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE; 885 } 886 887#ifdef FEATURE_extra_context_init 888 _mesa_initialize_context_extra(ctx); 889#endif 890 891 ctx->FirstTimeCurrent = GL_TRUE; 892 893 return GL_TRUE; 894} 895 896 897/** 898 * Allocate and initialize a GLcontext structure. 899 * Note that the driver needs to pass in its dd_function_table here since 900 * we need to at least call driverFunctions->NewTextureObject to initialize 901 * the rendering context. 902 * 903 * \param visual a GLvisual pointer (we copy the struct contents) 904 * \param share_list another context to share display lists with or NULL 905 * \param driverFunctions points to the dd_function_table into which the 906 * driver has plugged in all its special functions. 907 * \param driverContext points to the device driver's private context state 908 * 909 * \return pointer to a new __GLcontextRec or NULL if error. 910 */ 911GLcontext * 912_mesa_create_context(const GLvisual *visual, 913 GLcontext *share_list, 914 const struct dd_function_table *driverFunctions, 915 void *driverContext) 916{ 917 GLcontext *ctx; 918 919 ASSERT(visual); 920 /*ASSERT(driverContext);*/ 921 922 ctx = (GLcontext *) _mesa_calloc(sizeof(GLcontext)); 923 if (!ctx) 924 return NULL; 925 926 if (_mesa_initialize_context(ctx, visual, share_list, 927 driverFunctions, driverContext)) { 928 return ctx; 929 } 930 else { 931 _mesa_free(ctx); 932 return NULL; 933 } 934} 935 936 937/** 938 * Free the data associated with the given context. 939 * 940 * But doesn't free the GLcontext struct itself. 941 * 942 * \sa _mesa_initialize_context() and init_attrib_groups(). 943 */ 944void 945_mesa_free_context_data( GLcontext *ctx ) 946{ 947 if (!_mesa_get_current_context()){ 948 /* No current context, but we may need one in order to delete 949 * texture objs, etc. So temporarily bind the context now. 950 */ 951 _mesa_make_current(ctx, NULL, NULL); 952 } 953 954 /* unreference WinSysDraw/Read buffers */ 955 _mesa_reference_framebuffer(&ctx->WinSysDrawBuffer, NULL); 956 _mesa_reference_framebuffer(&ctx->WinSysReadBuffer, NULL); 957 _mesa_reference_framebuffer(&ctx->DrawBuffer, NULL); 958 _mesa_reference_framebuffer(&ctx->ReadBuffer, NULL); 959 960 _mesa_reference_vertprog(ctx, &ctx->VertexProgram.Current, NULL); 961 _mesa_reference_vertprog(ctx, &ctx->VertexProgram._Current, NULL); 962 _mesa_reference_vertprog(ctx, &ctx->VertexProgram._TnlProgram, NULL); 963 964 _mesa_reference_fragprog(ctx, &ctx->FragmentProgram.Current, NULL); 965 _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current, NULL); 966 _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._TexEnvProgram, NULL); 967 968 _mesa_free_attrib_data(ctx); 969 _mesa_free_buffer_objects(ctx); 970 _mesa_free_lighting_data( ctx ); 971 _mesa_free_eval_data( ctx ); 972 _mesa_free_texture_data( ctx ); 973 _mesa_free_matrix_data( ctx ); 974 _mesa_free_viewport_data( ctx ); 975 _mesa_free_colortables_data( ctx ); 976 _mesa_free_program_data(ctx); 977 _mesa_free_shader_state(ctx); 978 _mesa_free_queryobj_data(ctx); 979#if FEATURE_ARB_sync 980 _mesa_free_sync_data(ctx); 981#endif 982 _mesa_free_varray_data(ctx); 983 984 _mesa_delete_array_object(ctx, ctx->Array.DefaultArrayObj); 985 986#if FEATURE_ARB_pixel_buffer_object 987 _mesa_reference_buffer_object(ctx, &ctx->Pack.BufferObj, NULL); 988 _mesa_reference_buffer_object(ctx, &ctx->Unpack.BufferObj, NULL); 989 _mesa_reference_buffer_object(ctx, &ctx->DefaultPacking.BufferObj, NULL); 990#endif 991 992#if FEATURE_ARB_vertex_buffer_object 993 _mesa_reference_buffer_object(ctx, &ctx->Array.ArrayBufferObj, NULL); 994 _mesa_reference_buffer_object(ctx, &ctx->Array.ElementArrayBufferObj, NULL); 995#endif 996 997 /* free dispatch tables */ 998 _mesa_free(ctx->Exec); 999 _mesa_free(ctx->Save); 1000 1001 /* Shared context state (display lists, textures, etc) */ 1002 _mesa_release_shared_state( ctx, ctx->Shared ); 1003 1004 /* needs to be after freeing shared state */ 1005 _mesa_free_display_list_data(ctx); 1006 1007 if (ctx->Extensions.String) 1008 _mesa_free((void *) ctx->Extensions.String); 1009 1010 /* unbind the context if it's currently bound */ 1011 if (ctx == _mesa_get_current_context()) { 1012 _mesa_make_current(NULL, NULL, NULL); 1013 } 1014} 1015 1016 1017/** 1018 * Destroy a GLcontext structure. 1019 * 1020 * \param ctx GL context. 1021 * 1022 * Calls _mesa_free_context_data() and frees the GLcontext structure itself. 1023 */ 1024void 1025_mesa_destroy_context( GLcontext *ctx ) 1026{ 1027 if (ctx) { 1028 _mesa_free_context_data(ctx); 1029 _mesa_free( (void *) ctx ); 1030 } 1031} 1032 1033 1034#if _HAVE_FULL_GL 1035/** 1036 * Copy attribute groups from one context to another. 1037 * 1038 * \param src source context 1039 * \param dst destination context 1040 * \param mask bitwise OR of GL_*_BIT flags 1041 * 1042 * According to the bits specified in \p mask, copies the corresponding 1043 * attributes from \p src into \p dst. For many of the attributes a simple \c 1044 * memcpy is not enough due to the existence of internal pointers in their data 1045 * structures. 1046 */ 1047void 1048_mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask ) 1049{ 1050 if (mask & GL_ACCUM_BUFFER_BIT) { 1051 /* OK to memcpy */ 1052 dst->Accum = src->Accum; 1053 } 1054 if (mask & GL_COLOR_BUFFER_BIT) { 1055 /* OK to memcpy */ 1056 dst->Color = src->Color; 1057 } 1058 if (mask & GL_CURRENT_BIT) { 1059 /* OK to memcpy */ 1060 dst->Current = src->Current; 1061 } 1062 if (mask & GL_DEPTH_BUFFER_BIT) { 1063 /* OK to memcpy */ 1064 dst->Depth = src->Depth; 1065 } 1066 if (mask & GL_ENABLE_BIT) { 1067 /* no op */ 1068 } 1069 if (mask & GL_EVAL_BIT) { 1070 /* OK to memcpy */ 1071 dst->Eval = src->Eval; 1072 } 1073 if (mask & GL_FOG_BIT) { 1074 /* OK to memcpy */ 1075 dst->Fog = src->Fog; 1076 } 1077 if (mask & GL_HINT_BIT) { 1078 /* OK to memcpy */ 1079 dst->Hint = src->Hint; 1080 } 1081 if (mask & GL_LIGHTING_BIT) { 1082 GLuint i; 1083 /* begin with memcpy */ 1084 dst->Light = src->Light; 1085 /* fixup linked lists to prevent pointer insanity */ 1086 make_empty_list( &(dst->Light.EnabledList) ); 1087 for (i = 0; i < MAX_LIGHTS; i++) { 1088 if (dst->Light.Light[i].Enabled) { 1089 insert_at_tail(&(dst->Light.EnabledList), &(dst->Light.Light[i])); 1090 } 1091 } 1092 } 1093 if (mask & GL_LINE_BIT) { 1094 /* OK to memcpy */ 1095 dst->Line = src->Line; 1096 } 1097 if (mask & GL_LIST_BIT) { 1098 /* OK to memcpy */ 1099 dst->List = src->List; 1100 } 1101 if (mask & GL_PIXEL_MODE_BIT) { 1102 /* OK to memcpy */ 1103 dst->Pixel = src->Pixel; 1104 } 1105 if (mask & GL_POINT_BIT) { 1106 /* OK to memcpy */ 1107 dst->Point = src->Point; 1108 } 1109 if (mask & GL_POLYGON_BIT) { 1110 /* OK to memcpy */ 1111 dst->Polygon = src->Polygon; 1112 } 1113 if (mask & GL_POLYGON_STIPPLE_BIT) { 1114 /* Use loop instead of MEMCPY due to problem with Portland Group's 1115 * C compiler. Reported by John Stone. 1116 */ 1117 GLuint i; 1118 for (i = 0; i < 32; i++) { 1119 dst->PolygonStipple[i] = src->PolygonStipple[i]; 1120 } 1121 } 1122 if (mask & GL_SCISSOR_BIT) { 1123 /* OK to memcpy */ 1124 dst->Scissor = src->Scissor; 1125 } 1126 if (mask & GL_STENCIL_BUFFER_BIT) { 1127 /* OK to memcpy */ 1128 dst->Stencil = src->Stencil; 1129 } 1130 if (mask & GL_TEXTURE_BIT) { 1131 /* Cannot memcpy because of pointers */ 1132 _mesa_copy_texture_state(src, dst); 1133 } 1134 if (mask & GL_TRANSFORM_BIT) { 1135 /* OK to memcpy */ 1136 dst->Transform = src->Transform; 1137 } 1138 if (mask & GL_VIEWPORT_BIT) { 1139 /* Cannot use memcpy, because of pointers in GLmatrix _WindowMap */ 1140 dst->Viewport.X = src->Viewport.X; 1141 dst->Viewport.Y = src->Viewport.Y; 1142 dst->Viewport.Width = src->Viewport.Width; 1143 dst->Viewport.Height = src->Viewport.Height; 1144 dst->Viewport.Near = src->Viewport.Near; 1145 dst->Viewport.Far = src->Viewport.Far; 1146 _math_matrix_copy(&dst->Viewport._WindowMap, &src->Viewport._WindowMap); 1147 } 1148 1149 /* XXX FIXME: Call callbacks? 1150 */ 1151 dst->NewState = _NEW_ALL; 1152} 1153#endif 1154 1155 1156/** 1157 * Check if the given context can render into the given framebuffer 1158 * by checking visual attributes. 1159 * 1160 * Most of these tests could go away because Mesa is now pretty flexible 1161 * in terms of mixing rendering contexts with framebuffers. As long 1162 * as RGB vs. CI mode agree, we're probably good. 1163 * 1164 * \return GL_TRUE if compatible, GL_FALSE otherwise. 1165 */ 1166static GLboolean 1167check_compatible(const GLcontext *ctx, const GLframebuffer *buffer) 1168{ 1169 const GLvisual *ctxvis = &ctx->Visual; 1170 const GLvisual *bufvis = &buffer->Visual; 1171 1172 if (ctxvis == bufvis) 1173 return GL_TRUE; 1174 1175 if (ctxvis->rgbMode != bufvis->rgbMode) 1176 return GL_FALSE; 1177#if 0 1178 /* disabling this fixes the fgl_glxgears pbuffer demo */ 1179 if (ctxvis->doubleBufferMode && !bufvis->doubleBufferMode) 1180 return GL_FALSE; 1181#endif 1182 if (ctxvis->stereoMode && !bufvis->stereoMode) 1183 return GL_FALSE; 1184 if (ctxvis->haveAccumBuffer && !bufvis->haveAccumBuffer) 1185 return GL_FALSE; 1186 if (ctxvis->haveDepthBuffer && !bufvis->haveDepthBuffer) 1187 return GL_FALSE; 1188 if (ctxvis->haveStencilBuffer && !bufvis->haveStencilBuffer) 1189 return GL_FALSE; 1190 if (ctxvis->redMask && ctxvis->redMask != bufvis->redMask) 1191 return GL_FALSE; 1192 if (ctxvis->greenMask && ctxvis->greenMask != bufvis->greenMask) 1193 return GL_FALSE; 1194 if (ctxvis->blueMask && ctxvis->blueMask != bufvis->blueMask) 1195 return GL_FALSE; 1196#if 0 1197 /* disabled (see bug 11161) */ 1198 if (ctxvis->depthBits && ctxvis->depthBits != bufvis->depthBits) 1199 return GL_FALSE; 1200#endif 1201 if (ctxvis->stencilBits && ctxvis->stencilBits != bufvis->stencilBits) 1202 return GL_FALSE; 1203 1204 return GL_TRUE; 1205} 1206 1207 1208/** 1209 * Do one-time initialization for the given framebuffer. Specifically, 1210 * ask the driver for the window's current size and update the framebuffer 1211 * object to match. 1212 * Really, the device driver should totally take care of this. 1213 */ 1214static void 1215initialize_framebuffer_size(GLcontext *ctx, GLframebuffer *fb) 1216{ 1217 GLuint width, height; 1218 if (ctx->Driver.GetBufferSize) { 1219 ctx->Driver.GetBufferSize(fb, &width, &height); 1220 if (ctx->Driver.ResizeBuffers) 1221 ctx->Driver.ResizeBuffers(ctx, fb, width, height); 1222 fb->Initialized = GL_TRUE; 1223 } 1224} 1225 1226 1227/** 1228 * Check if the viewport/scissor size has not yet been initialized. 1229 * Initialize the size if the given width and height are non-zero. 1230 */ 1231void 1232_mesa_check_init_viewport(GLcontext *ctx, GLuint width, GLuint height) 1233{ 1234 if (!ctx->ViewportInitialized && width > 0 && height > 0) { 1235 /* Note: set flag here, before calling _mesa_set_viewport(), to prevent 1236 * potential infinite recursion. 1237 */ 1238 ctx->ViewportInitialized = GL_TRUE; 1239 _mesa_set_viewport(ctx, 0, 0, width, height); 1240 _mesa_set_scissor(ctx, 0, 0, width, height); 1241 } 1242} 1243 1244 1245/** 1246 * Bind the given context to the given drawBuffer and readBuffer and 1247 * make it the current context for the calling thread. 1248 * We'll render into the drawBuffer and read pixels from the 1249 * readBuffer (i.e. glRead/CopyPixels, glCopyTexImage, etc). 1250 * 1251 * We check that the context's and framebuffer's visuals are compatible 1252 * and return immediately if they're not. 1253 * 1254 * \param newCtx the new GL context. If NULL then there will be no current GL 1255 * context. 1256 * \param drawBuffer the drawing framebuffer 1257 * \param readBuffer the reading framebuffer 1258 */ 1259GLboolean 1260_mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer, 1261 GLframebuffer *readBuffer ) 1262{ 1263 if (MESA_VERBOSE & VERBOSE_API) 1264 _mesa_debug(newCtx, "_mesa_make_current()\n"); 1265 1266 /* Check that the context's and framebuffer's visuals are compatible. 1267 */ 1268 if (newCtx && drawBuffer && newCtx->WinSysDrawBuffer != drawBuffer) { 1269 if (!check_compatible(newCtx, drawBuffer)) { 1270 _mesa_warning(newCtx, 1271 "MakeCurrent: incompatible visuals for context and drawbuffer"); 1272 return GL_FALSE; 1273 } 1274 } 1275 if (newCtx && readBuffer && newCtx->WinSysReadBuffer != readBuffer) { 1276 if (!check_compatible(newCtx, readBuffer)) { 1277 _mesa_warning(newCtx, 1278 "MakeCurrent: incompatible visuals for context and readbuffer"); 1279 return GL_FALSE; 1280 } 1281 } 1282 1283 /* We used to call _glapi_check_multithread() here. Now do it in drivers */ 1284 _glapi_set_context((void *) newCtx); 1285 ASSERT(_mesa_get_current_context() == newCtx); 1286 1287 if (!newCtx) { 1288 _glapi_set_dispatch(NULL); /* none current */ 1289 } 1290 else { 1291 _glapi_set_dispatch(newCtx->CurrentDispatch); 1292 1293 if (drawBuffer && readBuffer) { 1294 /* TODO: check if newCtx and buffer's visual match??? */ 1295 1296 ASSERT(drawBuffer->Name == 0); 1297 ASSERT(readBuffer->Name == 0); 1298 _mesa_reference_framebuffer(&newCtx->WinSysDrawBuffer, drawBuffer); 1299 _mesa_reference_framebuffer(&newCtx->WinSysReadBuffer, readBuffer); 1300 1301 /* 1302 * Only set the context's Draw/ReadBuffer fields if they're NULL 1303 * or not bound to a user-created FBO. 1304 */ 1305 if (!newCtx->DrawBuffer || newCtx->DrawBuffer->Name == 0) { 1306 /* KW: merge conflict here, revisit. 1307 */ 1308 /* fix up the fb fields - these will end up wrong otherwise 1309 * if the DRIdrawable changes, and everything relies on them. 1310 * This is a bit messy (same as needed in _mesa_BindFramebufferEXT) 1311 */ 1312 unsigned int i; 1313 GLenum buffers[MAX_DRAW_BUFFERS]; 1314 1315 _mesa_reference_framebuffer(&newCtx->DrawBuffer, drawBuffer); 1316 1317 for(i = 0; i < newCtx->Const.MaxDrawBuffers; i++) { 1318 buffers[i] = newCtx->Color.DrawBuffer[i]; 1319 } 1320 1321 _mesa_drawbuffers(newCtx, newCtx->Const.MaxDrawBuffers, buffers, NULL); 1322 } 1323 if (!newCtx->ReadBuffer || newCtx->ReadBuffer->Name == 0) { 1324 _mesa_reference_framebuffer(&newCtx->ReadBuffer, readBuffer); 1325 } 1326 1327 /* XXX only set this flag if we're really changing the draw/read 1328 * framebuffer bindings. 1329 */ 1330 newCtx->NewState |= _NEW_BUFFERS; 1331 1332#if 1 1333 /* We want to get rid of these lines: */ 1334 1335#if _HAVE_FULL_GL 1336 if (!drawBuffer->Initialized) { 1337 initialize_framebuffer_size(newCtx, drawBuffer); 1338 } 1339 if (readBuffer != drawBuffer && !readBuffer->Initialized) { 1340 initialize_framebuffer_size(newCtx, readBuffer); 1341 } 1342 1343 _mesa_resizebuffers(newCtx); 1344#endif 1345 1346#else 1347 /* We want the drawBuffer and readBuffer to be initialized by 1348 * the driver. 1349 * This generally means the Width and Height match the actual 1350 * window size and the renderbuffers (both hardware and software 1351 * based) are allocated to match. The later can generally be 1352 * done with a call to _mesa_resize_framebuffer(). 1353 * 1354 * It's theoretically possible for a buffer to have zero width 1355 * or height, but for now, assert check that the driver did what's 1356 * expected of it. 1357 */ 1358 ASSERT(drawBuffer->Width > 0); 1359 ASSERT(drawBuffer->Height > 0); 1360#endif 1361 1362 if (drawBuffer) { 1363 _mesa_check_init_viewport(newCtx, 1364 drawBuffer->Width, drawBuffer->Height); 1365 } 1366 } 1367 1368 if (newCtx->FirstTimeCurrent) { 1369 check_context_limits(newCtx); 1370 1371 /* We can use this to help debug user's problems. Tell them to set 1372 * the MESA_INFO env variable before running their app. Then the 1373 * first time each context is made current we'll print some useful 1374 * information. 1375 */ 1376 if (_mesa_getenv("MESA_INFO")) { 1377 _mesa_print_info(); 1378 } 1379 1380 newCtx->FirstTimeCurrent = GL_FALSE; 1381 } 1382 } 1383 1384 return GL_TRUE; 1385} 1386 1387 1388/** 1389 * Make context 'ctx' share the display lists, textures and programs 1390 * that are associated with 'ctxToShare'. 1391 * Any display lists, textures or programs associated with 'ctx' will 1392 * be deleted if nobody else is sharing them. 1393 */ 1394GLboolean 1395_mesa_share_state(GLcontext *ctx, GLcontext *ctxToShare) 1396{ 1397 if (ctx && ctxToShare && ctx->Shared && ctxToShare->Shared) { 1398 struct gl_shared_state *oldSharedState = ctx->Shared; 1399 1400 ctx->Shared = ctxToShare->Shared; 1401 1402 _glthread_LOCK_MUTEX(ctx->Shared->Mutex); 1403 ctx->Shared->RefCount++; 1404 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); 1405 1406 update_default_objects(ctx); 1407 1408 _mesa_release_shared_state(ctx, oldSharedState); 1409 1410 return GL_TRUE; 1411 } 1412 else { 1413 return GL_FALSE; 1414 } 1415} 1416 1417 1418 1419/** 1420 * \return pointer to the current GL context for this thread. 1421 * 1422 * Calls _glapi_get_context(). This isn't the fastest way to get the current 1423 * context. If you need speed, see the #GET_CURRENT_CONTEXT macro in 1424 * context.h. 1425 */ 1426GLcontext * 1427_mesa_get_current_context( void ) 1428{ 1429 return (GLcontext *) _glapi_get_context(); 1430} 1431 1432 1433/** 1434 * Get context's current API dispatch table. 1435 * 1436 * It'll either be the immediate-mode execute dispatcher or the display list 1437 * compile dispatcher. 1438 * 1439 * \param ctx GL context. 1440 * 1441 * \return pointer to dispatch_table. 1442 * 1443 * Simply returns __GLcontextRec::CurrentDispatch. 1444 */ 1445struct _glapi_table * 1446_mesa_get_dispatch(GLcontext *ctx) 1447{ 1448 return ctx->CurrentDispatch; 1449} 1450 1451/*@}*/ 1452 1453 1454/**********************************************************************/ 1455/** \name Miscellaneous functions */ 1456/**********************************************************************/ 1457/*@{*/ 1458 1459/** 1460 * Record an error. 1461 * 1462 * \param ctx GL context. 1463 * \param error error code. 1464 * 1465 * Records the given error code and call the driver's dd_function_table::Error 1466 * function if defined. 1467 * 1468 * \sa 1469 * This is called via _mesa_error(). 1470 */ 1471void 1472_mesa_record_error(GLcontext *ctx, GLenum error) 1473{ 1474 if (!ctx) 1475 return; 1476 1477 if (ctx->ErrorValue == GL_NO_ERROR) { 1478 ctx->ErrorValue = error; 1479 } 1480 1481 /* Call device driver's error handler, if any. This is used on the Mac. */ 1482 if (ctx->Driver.Error) { 1483 ctx->Driver.Error(ctx); 1484 } 1485} 1486 1487 1488/** 1489 * Flush commands and wait for completion. 1490 */ 1491void 1492_mesa_finish(GLcontext *ctx) 1493{ 1494 FLUSH_CURRENT( ctx, 0 ); 1495 if (ctx->Driver.Finish) { 1496 ctx->Driver.Finish(ctx); 1497 } 1498} 1499 1500 1501/** 1502 * Flush commands. 1503 */ 1504void 1505_mesa_flush(GLcontext *ctx) 1506{ 1507 FLUSH_CURRENT( ctx, 0 ); 1508 if (ctx->Driver.Flush) { 1509 ctx->Driver.Flush(ctx); 1510 } 1511} 1512 1513 1514 1515/** 1516 * Execute glFinish(). 1517 * 1518 * Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the 1519 * dd_function_table::Finish driver callback, if not NULL. 1520 */ 1521void GLAPIENTRY 1522_mesa_Finish(void) 1523{ 1524 GET_CURRENT_CONTEXT(ctx); 1525 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 1526 _mesa_finish(ctx); 1527} 1528 1529 1530/** 1531 * Execute glFlush(). 1532 * 1533 * Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the 1534 * dd_function_table::Flush driver callback, if not NULL. 1535 */ 1536void GLAPIENTRY 1537_mesa_Flush(void) 1538{ 1539 GET_CURRENT_CONTEXT(ctx); 1540 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 1541 _mesa_flush(ctx); 1542} 1543 1544 1545/** 1546 * Set mvp_with_dp4 flag. If a driver has a preference for DP4 over 1547 * MUL/MAD, or vice versa, call this function to register that. 1548 * Otherwise we default to MUL/MAD. 1549 */ 1550void 1551_mesa_set_mvp_with_dp4( GLcontext *ctx, 1552 GLboolean flag ) 1553{ 1554 ctx->mvp_with_dp4 = flag; 1555} 1556 1557 1558 1559/** 1560 * Prior to drawing anything with glBegin, glDrawArrays, etc. this function 1561 * is called to see if it's valid to render. This involves checking that 1562 * the current shader is valid and the framebuffer is complete. 1563 * If an error is detected it'll be recorded here. 1564 * \return GL_TRUE if OK to render, GL_FALSE if not 1565 */ 1566GLboolean 1567_mesa_valid_to_render(GLcontext *ctx, const char *where) 1568{ 1569 /* This depends on having up to date derived state (shaders) */ 1570 if (ctx->NewState) 1571 _mesa_update_state(ctx); 1572 1573 if (ctx->Shader.CurrentProgram) { 1574 /* using shaders */ 1575 if (!ctx->Shader.CurrentProgram->LinkStatus) { 1576 _mesa_error(ctx, GL_INVALID_OPERATION, 1577 "%s(shader not linked), where"); 1578 return GL_FALSE; 1579 } 1580#if 0 /* not normally enabled */ 1581 { 1582 char errMsg[100]; 1583 if (!_mesa_validate_shader_program(ctx, ctx->Shader.CurrentProgram, 1584 errMsg)) { 1585 _mesa_warning(ctx, "Shader program %u is invalid: %s", 1586 ctx->Shader.CurrentProgram->Name, errMsg); 1587 } 1588 } 1589#endif 1590 } 1591 else { 1592 if (ctx->VertexProgram.Enabled && !ctx->VertexProgram._Enabled) { 1593 _mesa_error(ctx, GL_INVALID_OPERATION, 1594 "%s(vertex program not valid)", where); 1595 return GL_FALSE; 1596 } 1597 if (ctx->FragmentProgram.Enabled && !ctx->FragmentProgram._Enabled) { 1598 _mesa_error(ctx, GL_INVALID_OPERATION, 1599 "%s(fragment program not valid)", where); 1600 return GL_FALSE; 1601 } 1602 } 1603 1604 if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) { 1605 _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT, 1606 "%s(incomplete framebuffer)", where); 1607 return GL_FALSE; 1608 } 1609 1610#ifdef DEBUG 1611 if (ctx->Shader.Flags & GLSL_LOG) { 1612 struct gl_shader_program *shProg = ctx->Shader.CurrentProgram; 1613 if (shProg) { 1614 if (!shProg->_Used) { 1615 /* This is the first time this shader is being used. 1616 * Append shader's constants/uniforms to log file. 1617 */ 1618 GLuint i; 1619 for (i = 0; i < shProg->NumShaders; i++) { 1620 struct gl_shader *sh = shProg->Shaders[i]; 1621 if (sh->Type == GL_VERTEX_SHADER) { 1622 _mesa_append_uniforms_to_file(sh, 1623 &shProg->VertexProgram->Base); 1624 } 1625 else if (sh->Type == GL_FRAGMENT_SHADER) { 1626 _mesa_append_uniforms_to_file(sh, 1627 &shProg->FragmentProgram->Base); 1628 } 1629 } 1630 shProg->_Used = GL_TRUE; 1631 } 1632 } 1633 } 1634#endif 1635 1636 return GL_TRUE; 1637} 1638 1639 1640/*@}*/ 1641