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