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