1 /************************************************************************** 2 * 3 * Copyright 2007 VMware, Inc. 4 * Copyright (c) 2008 VMware, Inc. 5 * 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 9 * "Software"), to deal in the Software without restriction, including 10 * without limitation the rights to use, copy, modify, merge, publish, 11 * distribute, sub license, and/or sell copies of the Software, and to 12 * permit persons to whom the Software is furnished to do so, subject to 13 * the following conditions: 14 * 15 * The above copyright notice and this permission notice (including the 16 * next paragraph) shall be included in all copies or substantial portions 17 * of the Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 22 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 23 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 25 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26 * 27 **************************************************************************/ 28 29 #include "main/imports.h" 30 #include "main/context.h" 31 #include "main/macros.h" 32 #include "main/version.h" 33 34 #include "pipe/p_context.h" 35 #include "pipe/p_defines.h" 36 #include "pipe/p_screen.h" 37 #include "util/u_math.h" 38 39 #include "st_context.h" 40 #include "st_debug.h" 41 #include "st_extensions.h" 42 #include "st_format.h" 43 44 45 /* 46 * Note: we use these function rather than the MIN2, MAX2, CLAMP macros to 47 * avoid evaluating arguments (which are often function calls) more than once. 48 */ 49 50 static unsigned _min(unsigned a, unsigned b) 51 { 52 return (a < b) ? a : b; 53 } 54 55 static float _maxf(float a, float b) 56 { 57 return (a > b) ? a : b; 58 } 59 60 static int _clamp(int a, int min, int max) 61 { 62 if (a < min) 63 return min; 64 else if (a > max) 65 return max; 66 else 67 return a; 68 } 69 70 71 /** 72 * Query driver to get implementation limits. 73 * Note that we have to limit/clamp against Mesa's internal limits too. 74 */ 75 void st_init_limits(struct pipe_screen *screen, 76 struct gl_constants *c, struct gl_extensions *extensions, 77 gl_api api) 78 { 79 int supported_irs; 80 unsigned sh; 81 boolean can_ubo = TRUE; 82 int temp; 83 bool ssbo_atomic = true; 84 85 c->MaxTextureLevels 86 = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS), 87 MAX_TEXTURE_LEVELS); 88 89 c->Max3DTextureLevels 90 = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_3D_LEVELS), 91 MAX_3D_TEXTURE_LEVELS); 92 93 c->MaxCubeTextureLevels 94 = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS), 95 MAX_CUBE_TEXTURE_LEVELS); 96 97 c->MaxTextureRectSize 98 = _min(1 << (c->MaxTextureLevels - 1), MAX_TEXTURE_RECT_SIZE); 99 100 c->MaxArrayTextureLayers 101 = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS); 102 103 /* Define max viewport size and max renderbuffer size in terms of 104 * max texture size (note: max tex RECT size = max tex 2D size). 105 * If this isn't true for some hardware we'll need new PIPE_CAP_ queries. 106 */ 107 c->MaxViewportWidth = 108 c->MaxViewportHeight = 109 c->MaxRenderbufferSize = c->MaxTextureRectSize; 110 111 c->ViewportSubpixelBits = 112 screen->get_param(screen, PIPE_CAP_VIEWPORT_SUBPIXEL_BITS); 113 114 c->MaxDrawBuffers = c->MaxColorAttachments = 115 _clamp(screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS), 116 1, MAX_DRAW_BUFFERS); 117 118 c->MaxDualSourceDrawBuffers = 119 _clamp(screen->get_param(screen, 120 PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS), 121 0, MAX_DRAW_BUFFERS); 122 123 c->MaxLineWidth = 124 _maxf(1.0f, screen->get_paramf(screen, PIPE_CAPF_MAX_LINE_WIDTH)); 125 c->MaxLineWidthAA = 126 _maxf(1.0f, screen->get_paramf(screen, PIPE_CAPF_MAX_LINE_WIDTH_AA)); 127 128 c->MaxPointSize = 129 _maxf(1.0f, screen->get_paramf(screen, PIPE_CAPF_MAX_POINT_WIDTH)); 130 c->MaxPointSizeAA = 131 _maxf(1.0f, screen->get_paramf(screen, PIPE_CAPF_MAX_POINT_WIDTH_AA)); 132 133 /* these are not queryable. Note that GL basically mandates a 1.0 minimum 134 * for non-aa sizes, but we can go down to 0.0 for aa points. 135 */ 136 c->MinPointSize = 1.0f; 137 c->MinPointSizeAA = 0.0f; 138 139 c->MaxTextureMaxAnisotropy = 140 _maxf(2.0f, 141 screen->get_paramf(screen, PIPE_CAPF_MAX_TEXTURE_ANISOTROPY)); 142 143 c->MaxTextureLodBias = 144 screen->get_paramf(screen, PIPE_CAPF_MAX_TEXTURE_LOD_BIAS); 145 146 c->QuadsFollowProvokingVertexConvention = 147 screen->get_param(screen, 148 PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION); 149 150 c->MaxUniformBlockSize = 151 screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, 152 PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE); 153 if (c->MaxUniformBlockSize < 16384) { 154 can_ubo = FALSE; 155 } 156 157 for (sh = 0; sh < PIPE_SHADER_TYPES; ++sh) { 158 struct gl_shader_compiler_options *options; 159 struct gl_program_constants *pc; 160 161 switch (sh) { 162 case PIPE_SHADER_FRAGMENT: 163 pc = &c->Program[MESA_SHADER_FRAGMENT]; 164 options = &c->ShaderCompilerOptions[MESA_SHADER_FRAGMENT]; 165 break; 166 case PIPE_SHADER_VERTEX: 167 pc = &c->Program[MESA_SHADER_VERTEX]; 168 options = &c->ShaderCompilerOptions[MESA_SHADER_VERTEX]; 169 break; 170 case PIPE_SHADER_GEOMETRY: 171 pc = &c->Program[MESA_SHADER_GEOMETRY]; 172 options = &c->ShaderCompilerOptions[MESA_SHADER_GEOMETRY]; 173 break; 174 case PIPE_SHADER_TESS_CTRL: 175 pc = &c->Program[MESA_SHADER_TESS_CTRL]; 176 options = &c->ShaderCompilerOptions[MESA_SHADER_TESS_CTRL]; 177 break; 178 case PIPE_SHADER_TESS_EVAL: 179 pc = &c->Program[MESA_SHADER_TESS_EVAL]; 180 options = &c->ShaderCompilerOptions[MESA_SHADER_TESS_EVAL]; 181 break; 182 case PIPE_SHADER_COMPUTE: 183 pc = &c->Program[MESA_SHADER_COMPUTE]; 184 options = &c->ShaderCompilerOptions[MESA_SHADER_COMPUTE]; 185 186 if (!screen->get_param(screen, PIPE_CAP_COMPUTE)) 187 continue; 188 supported_irs = 189 screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_SUPPORTED_IRS); 190 if (!(supported_irs & (1 << PIPE_SHADER_IR_TGSI))) 191 continue; 192 break; 193 default: 194 assert(0); 195 } 196 197 pc->MaxTextureImageUnits = 198 _min(screen->get_shader_param(screen, sh, 199 PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS), 200 MAX_TEXTURE_IMAGE_UNITS); 201 202 pc->MaxInstructions = 203 pc->MaxNativeInstructions = 204 screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INSTRUCTIONS); 205 pc->MaxAluInstructions = 206 pc->MaxNativeAluInstructions = 207 screen->get_shader_param(screen, sh, 208 PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS); 209 pc->MaxTexInstructions = 210 pc->MaxNativeTexInstructions = 211 screen->get_shader_param(screen, sh, 212 PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS); 213 pc->MaxTexIndirections = 214 pc->MaxNativeTexIndirections = 215 screen->get_shader_param(screen, sh, 216 PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS); 217 pc->MaxAttribs = 218 pc->MaxNativeAttribs = 219 screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INPUTS); 220 pc->MaxTemps = 221 pc->MaxNativeTemps = 222 screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_TEMPS); 223 pc->MaxAddressRegs = 224 pc->MaxNativeAddressRegs = sh == PIPE_SHADER_VERTEX ? 1 : 0; 225 pc->MaxParameters = 226 pc->MaxNativeParameters = 227 screen->get_shader_param(screen, sh, 228 PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE) / sizeof(float[4]); 229 pc->MaxInputComponents = 230 screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INPUTS) * 4; 231 pc->MaxOutputComponents = 232 screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_OUTPUTS) * 4; 233 234 pc->MaxUniformComponents = 235 4 * MIN2(pc->MaxNativeParameters, MAX_UNIFORMS); 236 237 pc->MaxUniformBlocks = 238 screen->get_shader_param(screen, sh, 239 PIPE_SHADER_CAP_MAX_CONST_BUFFERS); 240 if (pc->MaxUniformBlocks) 241 pc->MaxUniformBlocks -= 1; /* The first one is for ordinary uniforms. */ 242 pc->MaxUniformBlocks = _min(pc->MaxUniformBlocks, MAX_UNIFORM_BUFFERS); 243 244 pc->MaxCombinedUniformComponents = (pc->MaxUniformComponents + 245 c->MaxUniformBlockSize / 4 * 246 pc->MaxUniformBlocks); 247 248 temp = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS); 249 if (temp) { 250 /* 251 * for separate atomic counters get the actual hw limits 252 * per stage on atomic counters and buffers 253 */ 254 ssbo_atomic = false; 255 pc->MaxAtomicCounters = temp; 256 pc->MaxAtomicBuffers = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS); 257 pc->MaxShaderStorageBlocks = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_SHADER_BUFFERS); 258 } else { 259 pc->MaxAtomicCounters = MAX_ATOMIC_COUNTERS; 260 pc->MaxAtomicBuffers = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_SHADER_BUFFERS) / 2; 261 pc->MaxShaderStorageBlocks = pc->MaxAtomicBuffers; 262 } 263 pc->MaxImageUniforms = screen->get_shader_param( 264 screen, sh, PIPE_SHADER_CAP_MAX_SHADER_IMAGES); 265 266 /* Gallium doesn't really care about local vs. env parameters so use the 267 * same limits. 268 */ 269 pc->MaxLocalParams = MIN2(pc->MaxParameters, MAX_PROGRAM_LOCAL_PARAMS); 270 pc->MaxEnvParams = MIN2(pc->MaxParameters, MAX_PROGRAM_ENV_PARAMS); 271 272 if (screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_INTEGERS)) { 273 pc->LowInt.RangeMin = 31; 274 pc->LowInt.RangeMax = 30; 275 pc->LowInt.Precision = 0; 276 pc->MediumInt = pc->HighInt = pc->LowInt; 277 } 278 279 /* TODO: make these more fine-grained if anyone needs it */ 280 options->MaxIfDepth = 281 screen->get_shader_param(screen, sh, 282 PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH); 283 options->EmitNoLoops = 284 !screen->get_shader_param(screen, sh, 285 PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH); 286 options->EmitNoMainReturn = 287 !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_SUBROUTINES); 288 289 options->EmitNoCont = 290 !screen->get_shader_param(screen, sh, 291 PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED); 292 293 options->EmitNoIndirectInput = 294 !screen->get_shader_param(screen, sh, 295 PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR); 296 options->EmitNoIndirectOutput = 297 !screen->get_shader_param(screen, sh, 298 PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR); 299 options->EmitNoIndirectTemp = 300 !screen->get_shader_param(screen, sh, 301 PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR); 302 options->EmitNoIndirectUniform = 303 !screen->get_shader_param(screen, sh, 304 PIPE_SHADER_CAP_INDIRECT_CONST_ADDR); 305 306 if (pc->MaxNativeInstructions && 307 (options->EmitNoIndirectUniform || pc->MaxUniformBlocks < 12)) { 308 can_ubo = FALSE; 309 } 310 311 if (options->EmitNoLoops) 312 options->MaxUnrollIterations = 313 MIN2(screen->get_shader_param(screen, sh, 314 PIPE_SHADER_CAP_MAX_INSTRUCTIONS), 315 65536); 316 else 317 options->MaxUnrollIterations = 318 screen->get_shader_param(screen, sh, 319 PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT); 320 321 options->LowerCombinedClipCullDistance = true; 322 options->LowerBufferInterfaceBlocks = true; 323 } 324 325 c->GLSLOptimizeConservatively = 326 screen->get_param(screen, PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY); 327 c->LowerTessLevel = true; 328 c->LowerCsDerivedVariables = true; 329 c->PrimitiveRestartForPatches = 330 screen->get_param(screen, PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES); 331 332 c->MaxCombinedTextureImageUnits = 333 _min(c->Program[MESA_SHADER_VERTEX].MaxTextureImageUnits + 334 c->Program[MESA_SHADER_TESS_CTRL].MaxTextureImageUnits + 335 c->Program[MESA_SHADER_TESS_EVAL].MaxTextureImageUnits + 336 c->Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits + 337 c->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits + 338 c->Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits, 339 MAX_COMBINED_TEXTURE_IMAGE_UNITS); 340 341 /* This depends on program constants. */ 342 c->MaxTextureCoordUnits 343 = _min(c->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits, 344 MAX_TEXTURE_COORD_UNITS); 345 346 c->MaxTextureUnits = 347 _min(c->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits, 348 c->MaxTextureCoordUnits); 349 350 c->Program[MESA_SHADER_VERTEX].MaxAttribs = 351 MIN2(c->Program[MESA_SHADER_VERTEX].MaxAttribs, 16); 352 353 /* PIPE_SHADER_CAP_MAX_INPUTS for the FS specifies the maximum number 354 * of inputs. It's always 2 colors + N generic inputs. */ 355 c->MaxVarying = screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, 356 PIPE_SHADER_CAP_MAX_INPUTS); 357 c->MaxVarying = MIN2(c->MaxVarying, MAX_VARYING); 358 c->MaxGeometryOutputVertices = 359 screen->get_param(screen, PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES); 360 c->MaxGeometryTotalOutputComponents = 361 screen->get_param(screen, PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS); 362 c->MaxTessPatchComponents = 363 MIN2(screen->get_param(screen, PIPE_CAP_MAX_SHADER_PATCH_VARYINGS), 364 MAX_VARYING) * 4; 365 366 c->MinProgramTexelOffset = 367 screen->get_param(screen, PIPE_CAP_MIN_TEXEL_OFFSET); 368 c->MaxProgramTexelOffset = 369 screen->get_param(screen, PIPE_CAP_MAX_TEXEL_OFFSET); 370 371 c->MaxProgramTextureGatherComponents = 372 screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS); 373 c->MinProgramTextureGatherOffset = 374 screen->get_param(screen, PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET); 375 c->MaxProgramTextureGatherOffset = 376 screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET); 377 378 c->MaxTransformFeedbackBuffers = 379 screen->get_param(screen, PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS); 380 c->MaxTransformFeedbackBuffers = MIN2(c->MaxTransformFeedbackBuffers, 381 MAX_FEEDBACK_BUFFERS); 382 c->MaxTransformFeedbackSeparateComponents = 383 screen->get_param(screen, PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS); 384 c->MaxTransformFeedbackInterleavedComponents = 385 screen->get_param(screen, 386 PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS); 387 c->MaxVertexStreams = 388 MAX2(1, screen->get_param(screen, PIPE_CAP_MAX_VERTEX_STREAMS)); 389 390 /* The vertex stream must fit into pipe_stream_output_info::stream */ 391 assert(c->MaxVertexStreams <= 4); 392 393 c->MaxVertexAttribStride 394 = screen->get_param(screen, PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE); 395 396 c->StripTextureBorder = GL_TRUE; 397 398 c->GLSLSkipStrictMaxUniformLimitCheck = 399 screen->get_param(screen, PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS); 400 401 c->UniformBufferOffsetAlignment = 402 screen->get_param(screen, PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT); 403 404 if (can_ubo) { 405 extensions->ARB_uniform_buffer_object = GL_TRUE; 406 c->MaxCombinedUniformBlocks = c->MaxUniformBufferBindings = 407 c->Program[MESA_SHADER_VERTEX].MaxUniformBlocks + 408 c->Program[MESA_SHADER_TESS_CTRL].MaxUniformBlocks + 409 c->Program[MESA_SHADER_TESS_EVAL].MaxUniformBlocks + 410 c->Program[MESA_SHADER_GEOMETRY].MaxUniformBlocks + 411 c->Program[MESA_SHADER_FRAGMENT].MaxUniformBlocks + 412 c->Program[MESA_SHADER_COMPUTE].MaxUniformBlocks; 413 assert(c->MaxCombinedUniformBlocks <= MAX_COMBINED_UNIFORM_BUFFERS); 414 } 415 416 c->GLSLFragCoordIsSysVal = 417 screen->get_param(screen, PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL); 418 c->GLSLFrontFacingIsSysVal = 419 screen->get_param(screen, PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL); 420 421 /* GL_ARB_get_program_binary 422 * 423 * The QT framework has a bug in their shader program cache, which is built 424 * on GL_ARB_get_program_binary. In an effort to allow them to fix the bug 425 * we don't enable more than 1 binary format for compatibility profiles. 426 */ 427 if (api != API_OPENGL_COMPAT && 428 screen->get_disk_shader_cache && screen->get_disk_shader_cache(screen)) 429 c->NumProgramBinaryFormats = 1; 430 431 c->MaxAtomicBufferBindings = 432 c->Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers; 433 434 if (!ssbo_atomic) { 435 /* for separate atomic buffers - there atomic buffer size will be 436 limited */ 437 c->MaxAtomicBufferSize = c->Program[MESA_SHADER_FRAGMENT].MaxAtomicCounters * ATOMIC_COUNTER_SIZE; 438 /* on all HW with separate atomic (evergreen) the following 439 lines are true. not sure it's worth adding CAPs for this at this 440 stage. */ 441 c->MaxCombinedAtomicCounters = c->Program[MESA_SHADER_FRAGMENT].MaxAtomicCounters; 442 c->MaxCombinedAtomicBuffers = c->Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers; 443 } else { 444 c->MaxCombinedAtomicBuffers = 445 c->Program[MESA_SHADER_VERTEX].MaxAtomicBuffers + 446 c->Program[MESA_SHADER_TESS_CTRL].MaxAtomicBuffers + 447 c->Program[MESA_SHADER_TESS_EVAL].MaxAtomicBuffers + 448 c->Program[MESA_SHADER_GEOMETRY].MaxAtomicBuffers + 449 c->Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers; 450 assert(c->MaxCombinedAtomicBuffers <= MAX_COMBINED_ATOMIC_BUFFERS); 451 } 452 453 if (c->MaxCombinedAtomicBuffers > 0) { 454 extensions->ARB_shader_atomic_counters = GL_TRUE; 455 extensions->ARB_shader_atomic_counter_ops = GL_TRUE; 456 } 457 458 c->MaxCombinedShaderOutputResources = c->MaxDrawBuffers; 459 c->ShaderStorageBufferOffsetAlignment = 460 screen->get_param(screen, PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT); 461 if (c->ShaderStorageBufferOffsetAlignment) { 462 /* for hw atomic counters leaves these at default for now */ 463 if (ssbo_atomic) 464 c->MaxCombinedShaderStorageBlocks = c->MaxShaderStorageBufferBindings = 465 c->MaxCombinedAtomicBuffers; 466 c->MaxCombinedShaderOutputResources += 467 c->MaxCombinedShaderStorageBlocks; 468 c->MaxShaderStorageBlockSize = 1 << 27; 469 extensions->ARB_shader_storage_buffer_object = GL_TRUE; 470 } 471 472 c->MaxCombinedImageUniforms = 473 c->Program[MESA_SHADER_VERTEX].MaxImageUniforms + 474 c->Program[MESA_SHADER_TESS_CTRL].MaxImageUniforms + 475 c->Program[MESA_SHADER_TESS_EVAL].MaxImageUniforms + 476 c->Program[MESA_SHADER_GEOMETRY].MaxImageUniforms + 477 c->Program[MESA_SHADER_FRAGMENT].MaxImageUniforms + 478 c->Program[MESA_SHADER_COMPUTE].MaxImageUniforms; 479 c->MaxCombinedShaderOutputResources += c->MaxCombinedImageUniforms; 480 c->MaxImageUnits = MAX_IMAGE_UNITS; 481 if (c->MaxCombinedImageUniforms) { 482 extensions->ARB_shader_image_load_store = GL_TRUE; 483 extensions->ARB_shader_image_size = GL_TRUE; 484 } 485 486 /* ARB_framebuffer_no_attachments */ 487 c->MaxFramebufferWidth = c->MaxViewportWidth; 488 c->MaxFramebufferHeight = c->MaxViewportHeight; 489 /* NOTE: we cheat here a little by assuming that 490 * PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS has the same 491 * number of layers as we need, although we technically 492 * could have more the generality is not really useful 493 * in practicality. 494 */ 495 c->MaxFramebufferLayers = 496 screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS); 497 498 c->MaxWindowRectangles = 499 screen->get_param(screen, PIPE_CAP_MAX_WINDOW_RECTANGLES); 500 501 c->SparseBufferPageSize = 502 screen->get_param(screen, PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE); 503 504 c->AllowMappedBuffersDuringExecution = 505 screen->get_param(screen, PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION); 506 507 c->UseSTD430AsDefaultPacking = 508 screen->get_param(screen, PIPE_CAP_LOAD_CONSTBUF); 509 510 /* limit the max combined shader output resources to a driver limit */ 511 temp = screen->get_param(screen, PIPE_CAP_MAX_COMBINED_SHADER_OUTPUT_RESOURCES); 512 if (temp > 0 && c->MaxCombinedShaderOutputResources > temp) 513 c->MaxCombinedShaderOutputResources = temp; 514 } 515 516 517 /** 518 * Given a member \c x of struct gl_extensions, return offset of 519 * \c x in bytes. 520 */ 521 #define o(x) offsetof(struct gl_extensions, x) 522 523 524 struct st_extension_cap_mapping { 525 int extension_offset; 526 int cap; 527 }; 528 529 struct st_extension_format_mapping { 530 int extension_offset[2]; 531 enum pipe_format format[32]; 532 533 /* If TRUE, at least one format must be supported for the extensions to be 534 * advertised. If FALSE, all the formats must be supported. */ 535 GLboolean need_at_least_one; 536 }; 537 538 /** 539 * Enable extensions if certain pipe formats are supported by the driver. 540 * What extensions will be enabled and what formats must be supported is 541 * described by the array of st_extension_format_mapping. 542 * 543 * target and bind_flags are passed to is_format_supported. 544 */ 545 static void 546 init_format_extensions(struct pipe_screen *screen, 547 struct gl_extensions *extensions, 548 const struct st_extension_format_mapping *mapping, 549 unsigned num_mappings, 550 enum pipe_texture_target target, 551 unsigned bind_flags) 552 { 553 GLboolean *extension_table = (GLboolean *) extensions; 554 unsigned i; 555 int j; 556 int num_formats = ARRAY_SIZE(mapping->format); 557 int num_ext = ARRAY_SIZE(mapping->extension_offset); 558 559 for (i = 0; i < num_mappings; i++) { 560 int num_supported = 0; 561 562 /* Examine each format in the list. */ 563 for (j = 0; j < num_formats && mapping[i].format[j]; j++) { 564 if (screen->is_format_supported(screen, mapping[i].format[j], 565 target, 0, bind_flags)) { 566 num_supported++; 567 } 568 } 569 570 if (!num_supported || 571 (!mapping[i].need_at_least_one && num_supported != j)) { 572 continue; 573 } 574 575 /* Enable all extensions in the list. */ 576 for (j = 0; j < num_ext && mapping[i].extension_offset[j]; j++) 577 extension_table[mapping[i].extension_offset[j]] = GL_TRUE; 578 } 579 } 580 581 582 /** 583 * Given a list of formats and bind flags, return the maximum number 584 * of samples supported by any of those formats. 585 */ 586 static unsigned 587 get_max_samples_for_formats(struct pipe_screen *screen, 588 unsigned num_formats, 589 const enum pipe_format *formats, 590 unsigned max_samples, 591 unsigned bind) 592 { 593 unsigned i, f; 594 595 for (i = max_samples; i > 0; --i) { 596 for (f = 0; f < num_formats; f++) { 597 if (screen->is_format_supported(screen, formats[f], 598 PIPE_TEXTURE_2D, i, bind)) { 599 return i; 600 } 601 } 602 } 603 return 0; 604 } 605 606 607 /** 608 * Use pipe_screen::get_param() to query PIPE_CAP_ values to determine 609 * which GL extensions are supported. 610 * Quite a few extensions are always supported because they are standard 611 * features or can be built on top of other gallium features. 612 * Some fine tuning may still be needed. 613 */ 614 void st_init_extensions(struct pipe_screen *screen, 615 struct gl_constants *consts, 616 struct gl_extensions *extensions, 617 struct st_config_options *options, 618 gl_api api) 619 { 620 unsigned i; 621 GLboolean *extension_table = (GLboolean *) extensions; 622 623 static const struct st_extension_cap_mapping cap_mapping[] = { 624 { o(ARB_base_instance), PIPE_CAP_START_INSTANCE }, 625 { o(ARB_bindless_texture), PIPE_CAP_BINDLESS_TEXTURE }, 626 { o(ARB_buffer_storage), PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT }, 627 { o(ARB_clear_texture), PIPE_CAP_CLEAR_TEXTURE }, 628 { o(ARB_clip_control), PIPE_CAP_CLIP_HALFZ }, 629 { o(ARB_color_buffer_float), PIPE_CAP_VERTEX_COLOR_UNCLAMPED }, 630 { o(ARB_conditional_render_inverted), PIPE_CAP_CONDITIONAL_RENDER_INVERTED }, 631 { o(ARB_copy_image), PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS }, 632 { o(OES_copy_image), PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS }, 633 { o(ARB_cull_distance), PIPE_CAP_CULL_DISTANCE }, 634 { o(ARB_depth_clamp), PIPE_CAP_DEPTH_CLIP_DISABLE }, 635 { o(ARB_derivative_control), PIPE_CAP_TGSI_FS_FINE_DERIVATIVE }, 636 { o(ARB_draw_buffers_blend), PIPE_CAP_INDEP_BLEND_FUNC }, 637 { o(ARB_draw_indirect), PIPE_CAP_DRAW_INDIRECT }, 638 { o(ARB_draw_instanced), PIPE_CAP_TGSI_INSTANCEID }, 639 { o(ARB_framebuffer_object), PIPE_CAP_MIXED_FRAMEBUFFER_SIZES }, 640 { o(ARB_gpu_shader_int64), PIPE_CAP_INT64 }, 641 { o(ARB_indirect_parameters), PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS }, 642 { o(ARB_instanced_arrays), PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR }, 643 { o(ARB_occlusion_query), PIPE_CAP_OCCLUSION_QUERY }, 644 { o(ARB_occlusion_query2), PIPE_CAP_OCCLUSION_QUERY }, 645 { o(ARB_pipeline_statistics_query), PIPE_CAP_QUERY_PIPELINE_STATISTICS }, 646 { o(ARB_point_sprite), PIPE_CAP_POINT_SPRITE }, 647 { o(ARB_polygon_offset_clamp), PIPE_CAP_POLYGON_OFFSET_CLAMP }, 648 { o(ARB_post_depth_coverage), PIPE_CAP_POST_DEPTH_COVERAGE }, 649 { o(ARB_query_buffer_object), PIPE_CAP_QUERY_BUFFER_OBJECT }, 650 { o(ARB_robust_buffer_access_behavior), PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR }, 651 { o(ARB_sample_shading), PIPE_CAP_SAMPLE_SHADING }, 652 { o(ARB_seamless_cube_map), PIPE_CAP_SEAMLESS_CUBE_MAP }, 653 { o(ARB_shader_ballot), PIPE_CAP_TGSI_BALLOT }, 654 { o(ARB_shader_clock), PIPE_CAP_TGSI_CLOCK }, 655 { o(ARB_shader_draw_parameters), PIPE_CAP_DRAW_PARAMETERS }, 656 { o(ARB_shader_group_vote), PIPE_CAP_TGSI_VOTE }, 657 { o(ARB_shader_stencil_export), PIPE_CAP_SHADER_STENCIL_EXPORT }, 658 { o(ARB_shader_texture_image_samples), PIPE_CAP_TGSI_TXQS }, 659 { o(ARB_shader_texture_lod), PIPE_CAP_SM3 }, 660 { o(ARB_sparse_buffer), PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE }, 661 { o(ARB_texture_buffer_object), PIPE_CAP_TEXTURE_BUFFER_OBJECTS }, 662 { o(ARB_texture_cube_map_array), PIPE_CAP_CUBE_MAP_ARRAY }, 663 { o(ARB_texture_gather), PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS }, 664 { o(ARB_texture_mirror_clamp_to_edge), PIPE_CAP_TEXTURE_MIRROR_CLAMP }, 665 { o(ARB_texture_multisample), PIPE_CAP_TEXTURE_MULTISAMPLE }, 666 { o(ARB_texture_non_power_of_two), PIPE_CAP_NPOT_TEXTURES }, 667 { o(ARB_texture_query_lod), PIPE_CAP_TEXTURE_QUERY_LOD }, 668 { o(ARB_texture_view), PIPE_CAP_SAMPLER_VIEW_TARGET }, 669 { o(ARB_timer_query), PIPE_CAP_QUERY_TIMESTAMP }, 670 { o(ARB_transform_feedback2), PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME }, 671 { o(ARB_transform_feedback3), PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS }, 672 { o(ARB_transform_feedback_overflow_query), PIPE_CAP_QUERY_SO_OVERFLOW }, 673 674 { o(KHR_blend_equation_advanced), PIPE_CAP_TGSI_FS_FBFETCH }, 675 676 { o(EXT_blend_equation_separate), PIPE_CAP_BLEND_EQUATION_SEPARATE }, 677 { o(EXT_depth_bounds_test), PIPE_CAP_DEPTH_BOUNDS_TEST }, 678 { o(EXT_draw_buffers2), PIPE_CAP_INDEP_BLEND_ENABLE }, 679 { o(EXT_memory_object), PIPE_CAP_MEMOBJ }, 680 { o(EXT_memory_object_fd), PIPE_CAP_MEMOBJ }, 681 { o(EXT_texture_array), PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS }, 682 { o(EXT_texture_filter_anisotropic), PIPE_CAP_ANISOTROPIC_FILTER }, 683 { o(EXT_texture_mirror_clamp), PIPE_CAP_TEXTURE_MIRROR_CLAMP }, 684 { o(EXT_texture_swizzle), PIPE_CAP_TEXTURE_SWIZZLE }, 685 { o(EXT_transform_feedback), PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS }, 686 { o(EXT_window_rectangles), PIPE_CAP_MAX_WINDOW_RECTANGLES }, 687 688 { o(AMD_pinned_memory), PIPE_CAP_RESOURCE_FROM_USER_MEMORY }, 689 { o(ATI_meminfo), PIPE_CAP_QUERY_MEMORY_INFO }, 690 { o(AMD_seamless_cubemap_per_texture), PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE }, 691 { o(ATI_texture_mirror_once), PIPE_CAP_TEXTURE_MIRROR_CLAMP }, 692 { o(MESA_tile_raster_order), PIPE_CAP_TILE_RASTER_ORDER }, 693 { o(NV_conditional_render), PIPE_CAP_CONDITIONAL_RENDER }, 694 { o(NV_fill_rectangle), PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE }, 695 { o(NV_primitive_restart), PIPE_CAP_PRIMITIVE_RESTART }, 696 { o(NV_texture_barrier), PIPE_CAP_TEXTURE_BARRIER }, 697 { o(NVX_gpu_memory_info), PIPE_CAP_QUERY_MEMORY_INFO }, 698 /* GL_NV_point_sprite is not supported by gallium because we don't 699 * support the GL_POINT_SPRITE_R_MODE_NV option. */ 700 701 { o(OES_standard_derivatives), PIPE_CAP_SM3 }, 702 { o(OES_texture_float_linear), PIPE_CAP_TEXTURE_FLOAT_LINEAR }, 703 { o(OES_texture_half_float_linear), PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR }, 704 }; 705 706 /* Required: render target and sampler support */ 707 static const struct st_extension_format_mapping rendertarget_mapping[] = { 708 { { o(ARB_texture_float) }, 709 { PIPE_FORMAT_R32G32B32A32_FLOAT, 710 PIPE_FORMAT_R16G16B16A16_FLOAT } }, 711 712 { { o(OES_texture_float) }, 713 { PIPE_FORMAT_R32G32B32A32_FLOAT } }, 714 715 { { o(OES_texture_half_float) }, 716 { PIPE_FORMAT_R16G16B16A16_FLOAT } }, 717 718 { { o(ARB_texture_rgb10_a2ui) }, 719 { PIPE_FORMAT_R10G10B10A2_UINT, 720 PIPE_FORMAT_B10G10R10A2_UINT }, 721 GL_TRUE }, /* at least one format must be supported */ 722 723 { { o(EXT_framebuffer_sRGB) }, 724 { PIPE_FORMAT_A8B8G8R8_SRGB, 725 PIPE_FORMAT_B8G8R8A8_SRGB }, 726 GL_TRUE }, /* at least one format must be supported */ 727 728 { { o(EXT_packed_float) }, 729 { PIPE_FORMAT_R11G11B10_FLOAT } }, 730 731 { { o(EXT_texture_integer) }, 732 { PIPE_FORMAT_R32G32B32A32_UINT, 733 PIPE_FORMAT_R32G32B32A32_SINT } }, 734 735 { { o(ARB_texture_rg) }, 736 { PIPE_FORMAT_R8_UNORM, 737 PIPE_FORMAT_R8G8_UNORM } }, 738 }; 739 740 /* Required: depth stencil and sampler support */ 741 static const struct st_extension_format_mapping depthstencil_mapping[] = { 742 { { o(ARB_depth_buffer_float) }, 743 { PIPE_FORMAT_Z32_FLOAT, 744 PIPE_FORMAT_Z32_FLOAT_S8X24_UINT } }, 745 }; 746 747 /* Required: sampler support */ 748 static const struct st_extension_format_mapping texture_mapping[] = { 749 { { o(ARB_texture_compression_rgtc) }, 750 { PIPE_FORMAT_RGTC1_UNORM, 751 PIPE_FORMAT_RGTC1_SNORM, 752 PIPE_FORMAT_RGTC2_UNORM, 753 PIPE_FORMAT_RGTC2_SNORM } }, 754 755 { { o(EXT_texture_compression_latc) }, 756 { PIPE_FORMAT_LATC1_UNORM, 757 PIPE_FORMAT_LATC1_SNORM, 758 PIPE_FORMAT_LATC2_UNORM, 759 PIPE_FORMAT_LATC2_SNORM } }, 760 761 { { o(EXT_texture_compression_s3tc), 762 o(ANGLE_texture_compression_dxt) }, 763 { PIPE_FORMAT_DXT1_RGB, 764 PIPE_FORMAT_DXT1_RGBA, 765 PIPE_FORMAT_DXT3_RGBA, 766 PIPE_FORMAT_DXT5_RGBA } }, 767 768 { { o(ARB_texture_compression_bptc) }, 769 { PIPE_FORMAT_BPTC_RGBA_UNORM, 770 PIPE_FORMAT_BPTC_SRGBA, 771 PIPE_FORMAT_BPTC_RGB_FLOAT, 772 PIPE_FORMAT_BPTC_RGB_UFLOAT } }, 773 774 { { o(KHR_texture_compression_astc_ldr) }, 775 { PIPE_FORMAT_ASTC_4x4, 776 PIPE_FORMAT_ASTC_5x4, 777 PIPE_FORMAT_ASTC_5x5, 778 PIPE_FORMAT_ASTC_6x5, 779 PIPE_FORMAT_ASTC_6x6, 780 PIPE_FORMAT_ASTC_8x5, 781 PIPE_FORMAT_ASTC_8x6, 782 PIPE_FORMAT_ASTC_8x8, 783 PIPE_FORMAT_ASTC_10x5, 784 PIPE_FORMAT_ASTC_10x6, 785 PIPE_FORMAT_ASTC_10x8, 786 PIPE_FORMAT_ASTC_10x10, 787 PIPE_FORMAT_ASTC_12x10, 788 PIPE_FORMAT_ASTC_12x12, 789 PIPE_FORMAT_ASTC_4x4_SRGB, 790 PIPE_FORMAT_ASTC_5x4_SRGB, 791 PIPE_FORMAT_ASTC_5x5_SRGB, 792 PIPE_FORMAT_ASTC_6x5_SRGB, 793 PIPE_FORMAT_ASTC_6x6_SRGB, 794 PIPE_FORMAT_ASTC_8x5_SRGB, 795 PIPE_FORMAT_ASTC_8x6_SRGB, 796 PIPE_FORMAT_ASTC_8x8_SRGB, 797 PIPE_FORMAT_ASTC_10x5_SRGB, 798 PIPE_FORMAT_ASTC_10x6_SRGB, 799 PIPE_FORMAT_ASTC_10x8_SRGB, 800 PIPE_FORMAT_ASTC_10x10_SRGB, 801 PIPE_FORMAT_ASTC_12x10_SRGB, 802 PIPE_FORMAT_ASTC_12x12_SRGB } }, 803 804 { { o(EXT_texture_shared_exponent) }, 805 { PIPE_FORMAT_R9G9B9E5_FLOAT } }, 806 807 { { o(EXT_texture_snorm) }, 808 { PIPE_FORMAT_R8G8B8A8_SNORM } }, 809 810 { { o(EXT_texture_sRGB), 811 o(EXT_texture_sRGB_decode) }, 812 { PIPE_FORMAT_A8B8G8R8_SRGB, 813 PIPE_FORMAT_B8G8R8A8_SRGB }, 814 GL_TRUE }, /* at least one format must be supported */ 815 816 { { o(EXT_texture_type_2_10_10_10_REV) }, 817 { PIPE_FORMAT_R10G10B10A2_UNORM, 818 PIPE_FORMAT_B10G10R10A2_UNORM }, 819 GL_TRUE }, /* at least one format must be supported */ 820 821 { { o(ATI_texture_compression_3dc) }, 822 { PIPE_FORMAT_LATC2_UNORM } }, 823 824 { { o(MESA_ycbcr_texture) }, 825 { PIPE_FORMAT_UYVY, 826 PIPE_FORMAT_YUYV }, 827 GL_TRUE }, /* at least one format must be supported */ 828 829 { { o(OES_compressed_ETC1_RGB8_texture) }, 830 { PIPE_FORMAT_ETC1_RGB8, 831 PIPE_FORMAT_R8G8B8A8_UNORM }, 832 GL_TRUE }, /* at least one format must be supported */ 833 834 { { o(ARB_stencil_texturing), 835 o(ARB_texture_stencil8) }, 836 { PIPE_FORMAT_X24S8_UINT, 837 PIPE_FORMAT_S8X24_UINT }, 838 GL_TRUE }, /* at least one format must be supported */ 839 }; 840 841 /* Required: vertex fetch support. */ 842 static const struct st_extension_format_mapping vertex_mapping[] = { 843 { { o(EXT_vertex_array_bgra) }, 844 { PIPE_FORMAT_B8G8R8A8_UNORM } }, 845 { { o(ARB_vertex_type_2_10_10_10_rev) }, 846 { PIPE_FORMAT_R10G10B10A2_UNORM, 847 PIPE_FORMAT_B10G10R10A2_UNORM, 848 PIPE_FORMAT_R10G10B10A2_SNORM, 849 PIPE_FORMAT_B10G10R10A2_SNORM, 850 PIPE_FORMAT_R10G10B10A2_USCALED, 851 PIPE_FORMAT_B10G10R10A2_USCALED, 852 PIPE_FORMAT_R10G10B10A2_SSCALED, 853 PIPE_FORMAT_B10G10R10A2_SSCALED } }, 854 { { o(ARB_vertex_type_10f_11f_11f_rev) }, 855 { PIPE_FORMAT_R11G11B10_FLOAT } }, 856 }; 857 858 static const struct st_extension_format_mapping tbo_rgb32[] = { 859 { {o(ARB_texture_buffer_object_rgb32) }, 860 { PIPE_FORMAT_R32G32B32_FLOAT, 861 PIPE_FORMAT_R32G32B32_UINT, 862 PIPE_FORMAT_R32G32B32_SINT, 863 } }, 864 }; 865 866 /* 867 * Extensions that are supported by all Gallium drivers: 868 */ 869 extensions->ARB_ES2_compatibility = GL_TRUE; 870 extensions->ARB_depth_texture = GL_TRUE; 871 extensions->ARB_draw_elements_base_vertex = GL_TRUE; 872 extensions->ARB_explicit_attrib_location = GL_TRUE; 873 extensions->ARB_explicit_uniform_location = GL_TRUE; 874 extensions->ARB_fragment_coord_conventions = GL_TRUE; 875 extensions->ARB_fragment_program = GL_TRUE; 876 extensions->ARB_fragment_program_shadow = GL_TRUE; 877 extensions->ARB_fragment_shader = GL_TRUE; 878 extensions->ARB_half_float_vertex = GL_TRUE; 879 extensions->ARB_internalformat_query = GL_TRUE; 880 extensions->ARB_internalformat_query2 = GL_TRUE; 881 extensions->ARB_map_buffer_range = GL_TRUE; 882 extensions->ARB_shadow = GL_TRUE; 883 extensions->ARB_sync = GL_TRUE; 884 extensions->ARB_texture_border_clamp = GL_TRUE; 885 extensions->ARB_texture_cube_map = GL_TRUE; 886 extensions->ARB_texture_env_combine = GL_TRUE; 887 extensions->ARB_texture_env_crossbar = GL_TRUE; 888 extensions->ARB_texture_env_dot3 = GL_TRUE; 889 extensions->ARB_vertex_program = GL_TRUE; 890 extensions->ARB_vertex_shader = GL_TRUE; 891 892 extensions->EXT_blend_color = GL_TRUE; 893 extensions->EXT_blend_func_separate = GL_TRUE; 894 extensions->EXT_blend_minmax = GL_TRUE; 895 extensions->EXT_gpu_program_parameters = GL_TRUE; 896 extensions->EXT_pixel_buffer_object = GL_TRUE; 897 extensions->EXT_point_parameters = GL_TRUE; 898 extensions->EXT_provoking_vertex = GL_TRUE; 899 extensions->EXT_stencil_two_side = GL_TRUE; 900 extensions->EXT_texture_env_dot3 = GL_TRUE; 901 902 extensions->ATI_fragment_shader = GL_TRUE; 903 extensions->ATI_separate_stencil = GL_TRUE; 904 extensions->ATI_texture_env_combine3 = GL_TRUE; 905 906 extensions->MESA_pack_invert = GL_TRUE; 907 908 extensions->NV_fog_distance = GL_TRUE; 909 extensions->NV_texture_env_combine4 = GL_TRUE; 910 extensions->NV_texture_rectangle = GL_TRUE; 911 912 extensions->OES_EGL_image = GL_TRUE; 913 extensions->OES_EGL_image_external = GL_TRUE; 914 extensions->OES_draw_texture = GL_TRUE; 915 916 /* Expose the extensions which directly correspond to gallium caps. */ 917 for (i = 0; i < ARRAY_SIZE(cap_mapping); i++) { 918 if (screen->get_param(screen, cap_mapping[i].cap)) { 919 extension_table[cap_mapping[i].extension_offset] = GL_TRUE; 920 } 921 } 922 923 /* Expose the extensions which directly correspond to gallium formats. */ 924 init_format_extensions(screen, extensions, rendertarget_mapping, 925 ARRAY_SIZE(rendertarget_mapping), PIPE_TEXTURE_2D, 926 PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW); 927 init_format_extensions(screen, extensions, depthstencil_mapping, 928 ARRAY_SIZE(depthstencil_mapping), PIPE_TEXTURE_2D, 929 PIPE_BIND_DEPTH_STENCIL | PIPE_BIND_SAMPLER_VIEW); 930 init_format_extensions(screen, extensions, texture_mapping, 931 ARRAY_SIZE(texture_mapping), PIPE_TEXTURE_2D, 932 PIPE_BIND_SAMPLER_VIEW); 933 init_format_extensions(screen, extensions, vertex_mapping, 934 ARRAY_SIZE(vertex_mapping), PIPE_BUFFER, 935 PIPE_BIND_VERTEX_BUFFER); 936 937 /* Figure out GLSL support and set GLSLVersion to it. */ 938 consts->GLSLVersion = screen->get_param(screen, PIPE_CAP_GLSL_FEATURE_LEVEL); 939 940 _mesa_override_glsl_version(consts); 941 942 if (options->force_glsl_version > 0 && 943 options->force_glsl_version <= consts->GLSLVersion) { 944 consts->ForceGLSLVersion = options->force_glsl_version; 945 } 946 947 consts->AllowHigherCompatVersion = options->allow_higher_compat_version; 948 949 consts->ForceGLSLAbsSqrt = options->force_glsl_abs_sqrt; 950 951 consts->AllowGLSLBuiltinVariableRedeclaration = options->allow_glsl_builtin_variable_redeclaration; 952 953 consts->dri_config_options_sha1 = options->config_options_sha1; 954 955 consts->AllowGLSLCrossStageInterpolationMismatch = options->allow_glsl_cross_stage_interpolation_mismatch; 956 957 if (consts->GLSLVersion >= 400) 958 extensions->ARB_gpu_shader5 = GL_TRUE; 959 if (consts->GLSLVersion >= 410) 960 extensions->ARB_shader_precision = GL_TRUE; 961 962 /* This extension needs full OpenGL 3.2, but we don't know if that's 963 * supported at this point. Only check the GLSL version. */ 964 if (consts->GLSLVersion >= 150 && 965 screen->get_param(screen, PIPE_CAP_TGSI_VS_LAYER_VIEWPORT)) { 966 extensions->AMD_vertex_shader_layer = GL_TRUE; 967 } 968 969 if (consts->GLSLVersion >= 140) { 970 if (screen->get_param(screen, PIPE_CAP_TGSI_ARRAY_COMPONENTS)) 971 extensions->ARB_enhanced_layouts = GL_TRUE; 972 } 973 974 if (consts->GLSLVersion >= 130) { 975 consts->NativeIntegers = GL_TRUE; 976 consts->MaxClipPlanes = 8; 977 978 if (screen->get_param(screen, PIPE_CAP_VERTEXID_NOBASE)) { 979 consts->VertexID_is_zero_based = GL_TRUE; 980 } 981 982 /* Extensions that either depend on GLSL 1.30 or are a subset thereof. */ 983 extensions->ARB_conservative_depth = GL_TRUE; 984 extensions->ARB_shading_language_packing = GL_TRUE; 985 extensions->OES_depth_texture_cube_map = GL_TRUE; 986 extensions->ARB_shading_language_420pack = GL_TRUE; 987 extensions->ARB_texture_query_levels = GL_TRUE; 988 989 if (!options->disable_shader_bit_encoding) { 990 extensions->ARB_shader_bit_encoding = GL_TRUE; 991 } 992 993 extensions->EXT_shader_integer_mix = GL_TRUE; 994 extensions->ARB_arrays_of_arrays = GL_TRUE; 995 extensions->MESA_shader_integer_functions = GL_TRUE; 996 } else { 997 /* Optional integer support for GLSL 1.2. */ 998 if (screen->get_shader_param(screen, PIPE_SHADER_VERTEX, 999 PIPE_SHADER_CAP_INTEGERS) && 1000 screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, 1001 PIPE_SHADER_CAP_INTEGERS)) { 1002 consts->NativeIntegers = GL_TRUE; 1003 1004 extensions->EXT_shader_integer_mix = GL_TRUE; 1005 } 1006 1007 /* Integer textures make no sense before GLSL 1.30 */ 1008 extensions->EXT_texture_integer = GL_FALSE; 1009 } 1010 1011 consts->GLSLZeroInit = options->glsl_zero_init; 1012 1013 consts->UniformBooleanTrue = consts->NativeIntegers ? ~0U : fui(1.0f); 1014 1015 /* Below are the cases which cannot be moved into tables easily. */ 1016 1017 if (screen->get_shader_param(screen, PIPE_SHADER_TESS_CTRL, 1018 PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0) { 1019 extensions->ARB_tessellation_shader = GL_TRUE; 1020 } 1021 1022 /* What this is really checking for is the ability to support multiple 1023 * invocations of a geometry shader. There is no separate cap for that, so 1024 * we check the GLSLVersion. 1025 */ 1026 if (consts->GLSLVersion >= 400 && 1027 screen->get_shader_param(screen, PIPE_SHADER_GEOMETRY, 1028 PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0) { 1029 extensions->OES_geometry_shader = GL_TRUE; 1030 } 1031 1032 /* Needs PIPE_CAP_SAMPLE_SHADING + all the sample-related bits of 1033 * ARB_gpu_shader5. This enables all the per-sample shading ES extensions. 1034 */ 1035 extensions->OES_sample_variables = extensions->ARB_sample_shading && 1036 extensions->ARB_gpu_shader5; 1037 1038 /* Maximum sample count. */ 1039 { 1040 static const enum pipe_format color_formats[] = { 1041 PIPE_FORMAT_R8G8B8A8_UNORM, 1042 PIPE_FORMAT_B8G8R8A8_UNORM, 1043 PIPE_FORMAT_A8R8G8B8_UNORM, 1044 PIPE_FORMAT_A8B8G8R8_UNORM, 1045 }; 1046 static const enum pipe_format depth_formats[] = { 1047 PIPE_FORMAT_Z16_UNORM, 1048 PIPE_FORMAT_Z24X8_UNORM, 1049 PIPE_FORMAT_X8Z24_UNORM, 1050 PIPE_FORMAT_Z32_UNORM, 1051 PIPE_FORMAT_Z32_FLOAT 1052 }; 1053 static const enum pipe_format int_formats[] = { 1054 PIPE_FORMAT_R8G8B8A8_SINT 1055 }; 1056 static const enum pipe_format void_formats[] = { 1057 PIPE_FORMAT_NONE 1058 }; 1059 1060 consts->MaxSamples = 1061 get_max_samples_for_formats(screen, ARRAY_SIZE(color_formats), 1062 color_formats, 16, 1063 PIPE_BIND_RENDER_TARGET); 1064 1065 consts->MaxImageSamples = 1066 get_max_samples_for_formats(screen, ARRAY_SIZE(color_formats), 1067 color_formats, 16, 1068 PIPE_BIND_SHADER_IMAGE); 1069 1070 consts->MaxColorTextureSamples = 1071 get_max_samples_for_formats(screen, ARRAY_SIZE(color_formats), 1072 color_formats, consts->MaxSamples, 1073 PIPE_BIND_SAMPLER_VIEW); 1074 1075 consts->MaxDepthTextureSamples = 1076 get_max_samples_for_formats(screen, ARRAY_SIZE(depth_formats), 1077 depth_formats, consts->MaxSamples, 1078 PIPE_BIND_SAMPLER_VIEW); 1079 1080 consts->MaxIntegerSamples = 1081 get_max_samples_for_formats(screen, ARRAY_SIZE(int_formats), 1082 int_formats, consts->MaxSamples, 1083 PIPE_BIND_SAMPLER_VIEW); 1084 1085 /* ARB_framebuffer_no_attachments, assume max no. of samples 32 */ 1086 consts->MaxFramebufferSamples = 1087 get_max_samples_for_formats(screen, ARRAY_SIZE(void_formats), 1088 void_formats, 32, 1089 PIPE_BIND_RENDER_TARGET); 1090 } 1091 1092 if (consts->MaxSamples >= 2) { 1093 /* Real MSAA support */ 1094 extensions->EXT_framebuffer_multisample = GL_TRUE; 1095 extensions->EXT_framebuffer_multisample_blit_scaled = GL_TRUE; 1096 } 1097 else if (consts->MaxSamples > 0 && 1098 screen->get_param(screen, PIPE_CAP_FAKE_SW_MSAA)) { 1099 /* fake MSAA support */ 1100 consts->FakeSWMSAA = GL_TRUE; 1101 extensions->EXT_framebuffer_multisample = GL_TRUE; 1102 extensions->EXT_framebuffer_multisample_blit_scaled = GL_TRUE; 1103 extensions->ARB_texture_multisample = GL_TRUE; 1104 } 1105 1106 if (consts->MaxDualSourceDrawBuffers > 0 && 1107 !options->disable_blend_func_extended) 1108 extensions->ARB_blend_func_extended = GL_TRUE; 1109 1110 if (screen->get_param(screen, PIPE_CAP_QUERY_TIME_ELAPSED) || 1111 extensions->ARB_timer_query) { 1112 extensions->EXT_timer_query = GL_TRUE; 1113 } 1114 1115 if (extensions->ARB_transform_feedback2 && 1116 extensions->ARB_draw_instanced) { 1117 extensions->ARB_transform_feedback_instanced = GL_TRUE; 1118 } 1119 if (options->force_glsl_extensions_warn) 1120 consts->ForceGLSLExtensionsWarn = 1; 1121 1122 if (options->disable_glsl_line_continuations) 1123 consts->DisableGLSLLineContinuations = 1; 1124 1125 if (options->allow_glsl_extension_directive_midshader) 1126 consts->AllowGLSLExtensionDirectiveMidShader = GL_TRUE; 1127 1128 consts->MinMapBufferAlignment = 1129 screen->get_param(screen, PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT); 1130 1131 /* The OpenGL Compatibility profile requires arbitrary buffer swizzling. */ 1132 if (api == API_OPENGL_COMPAT && 1133 screen->get_param(screen, PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY)) 1134 extensions->ARB_texture_buffer_object = GL_FALSE; 1135 1136 if (extensions->ARB_texture_buffer_object) { 1137 consts->MaxTextureBufferSize = 1138 _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE), 1139 (1u << 31) - 1); 1140 consts->TextureBufferOffsetAlignment = 1141 screen->get_param(screen, PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT); 1142 1143 if (consts->TextureBufferOffsetAlignment) 1144 extensions->ARB_texture_buffer_range = GL_TRUE; 1145 1146 init_format_extensions(screen, extensions, tbo_rgb32, 1147 ARRAY_SIZE(tbo_rgb32), PIPE_BUFFER, 1148 PIPE_BIND_SAMPLER_VIEW); 1149 } 1150 1151 extensions->OES_texture_buffer = 1152 extensions->ARB_texture_buffer_object && 1153 extensions->ARB_texture_buffer_range && 1154 extensions->ARB_texture_buffer_object_rgb32 && 1155 extensions->ARB_shader_image_load_store; 1156 1157 /* Unpacking a varying in the fragment shader costs 1 texture indirection. 1158 * If the number of available texture indirections is very limited, then we 1159 * prefer to disable varying packing rather than run the risk of varying 1160 * packing preventing a shader from running. 1161 */ 1162 if (screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, 1163 PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS) <= 8) { 1164 /* We can't disable varying packing if transform feedback is available, 1165 * because transform feedback code assumes a packed varying layout. 1166 */ 1167 if (!extensions->EXT_transform_feedback) 1168 consts->DisableVaryingPacking = GL_TRUE; 1169 } 1170 1171 consts->MaxViewports = screen->get_param(screen, PIPE_CAP_MAX_VIEWPORTS); 1172 if (consts->MaxViewports >= 16) { 1173 if (consts->GLSLVersion >= 400) { 1174 consts->ViewportBounds.Min = -32768.0; 1175 consts->ViewportBounds.Max = 32767.0; 1176 } else { 1177 consts->ViewportBounds.Min = -16384.0; 1178 consts->ViewportBounds.Max = 16383.0; 1179 } 1180 extensions->ARB_viewport_array = GL_TRUE; 1181 extensions->ARB_fragment_layer_viewport = GL_TRUE; 1182 if (extensions->AMD_vertex_shader_layer) 1183 extensions->AMD_vertex_shader_viewport_index = GL_TRUE; 1184 } 1185 1186 if (extensions->AMD_vertex_shader_layer && 1187 extensions->AMD_vertex_shader_viewport_index && 1188 screen->get_param(screen, PIPE_CAP_TGSI_TES_LAYER_VIEWPORT)) 1189 extensions->ARB_shader_viewport_layer_array = GL_TRUE; 1190 1191 /* ARB_framebuffer_no_attachments */ 1192 if (screen->get_param(screen, PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT) && 1193 ((consts->MaxSamples >= 4 && consts->MaxFramebufferLayers >= 2048) || 1194 (consts->MaxFramebufferSamples >= consts->MaxSamples && 1195 consts->MaxFramebufferLayers >= consts->MaxArrayTextureLayers))) 1196 extensions->ARB_framebuffer_no_attachments = GL_TRUE; 1197 1198 /* GL_ARB_ES3_compatibility. 1199 * 1200 * Assume that ES3 is supported if GLSL 3.30 is supported. 1201 * (OpenGL 3.3 is a requirement for that extension.) 1202 */ 1203 if (consts->GLSLVersion >= 330 && 1204 /* Requirements for ETC2 emulation. */ 1205 screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_UNORM, 1206 PIPE_TEXTURE_2D, 0, 1207 PIPE_BIND_SAMPLER_VIEW) && 1208 screen->is_format_supported(screen, PIPE_FORMAT_B8G8R8A8_SRGB, 1209 PIPE_TEXTURE_2D, 0, 1210 PIPE_BIND_SAMPLER_VIEW) && 1211 screen->is_format_supported(screen, PIPE_FORMAT_R16_UNORM, 1212 PIPE_TEXTURE_2D, 0, 1213 PIPE_BIND_SAMPLER_VIEW) && 1214 screen->is_format_supported(screen, PIPE_FORMAT_R16G16_UNORM, 1215 PIPE_TEXTURE_2D, 0, 1216 PIPE_BIND_SAMPLER_VIEW) && 1217 screen->is_format_supported(screen, PIPE_FORMAT_R16_SNORM, 1218 PIPE_TEXTURE_2D, 0, 1219 PIPE_BIND_SAMPLER_VIEW) && 1220 screen->is_format_supported(screen, PIPE_FORMAT_R16G16_SNORM, 1221 PIPE_TEXTURE_2D, 0, 1222 PIPE_BIND_SAMPLER_VIEW)) { 1223 extensions->ARB_ES3_compatibility = GL_TRUE; 1224 } 1225 1226 #ifdef HAVE_ST_VDPAU 1227 if (screen->get_video_param && 1228 screen->get_video_param(screen, PIPE_VIDEO_PROFILE_UNKNOWN, 1229 PIPE_VIDEO_ENTRYPOINT_BITSTREAM, 1230 PIPE_VIDEO_CAP_SUPPORTS_INTERLACED)) { 1231 extensions->NV_vdpau_interop = GL_TRUE; 1232 } 1233 #endif 1234 1235 if (screen->get_param(screen, PIPE_CAP_DOUBLES)) { 1236 extensions->ARB_gpu_shader_fp64 = GL_TRUE; 1237 extensions->ARB_vertex_attrib_64bit = GL_TRUE; 1238 } 1239 1240 if ((ST_DEBUG & DEBUG_GREMEDY) && 1241 screen->get_param(screen, PIPE_CAP_STRING_MARKER)) 1242 extensions->GREMEDY_string_marker = GL_TRUE; 1243 1244 if (screen->get_param(screen, PIPE_CAP_COMPUTE)) { 1245 int compute_supported_irs = 1246 screen->get_shader_param(screen, PIPE_SHADER_COMPUTE, 1247 PIPE_SHADER_CAP_SUPPORTED_IRS); 1248 if (compute_supported_irs & (1 << PIPE_SHADER_IR_TGSI)) { 1249 uint64_t grid_size[3], block_size[3]; 1250 uint64_t max_local_size, max_threads_per_block; 1251 1252 screen->get_compute_param(screen, PIPE_SHADER_IR_TGSI, 1253 PIPE_COMPUTE_CAP_MAX_GRID_SIZE, grid_size); 1254 screen->get_compute_param(screen, PIPE_SHADER_IR_TGSI, 1255 PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE, block_size); 1256 screen->get_compute_param(screen, PIPE_SHADER_IR_TGSI, 1257 PIPE_COMPUTE_CAP_MAX_THREADS_PER_BLOCK, 1258 &max_threads_per_block); 1259 screen->get_compute_param(screen, PIPE_SHADER_IR_TGSI, 1260 PIPE_COMPUTE_CAP_MAX_LOCAL_SIZE, 1261 &max_local_size); 1262 1263 consts->MaxComputeWorkGroupInvocations = max_threads_per_block; 1264 consts->MaxComputeSharedMemorySize = max_local_size; 1265 1266 for (i = 0; i < 3; i++) { 1267 consts->MaxComputeWorkGroupCount[i] = grid_size[i]; 1268 consts->MaxComputeWorkGroupSize[i] = block_size[i]; 1269 } 1270 1271 extensions->ARB_compute_shader = 1272 extensions->ARB_shader_image_load_store && 1273 extensions->ARB_shader_atomic_counters; 1274 1275 if (extensions->ARB_compute_shader) { 1276 uint64_t max_variable_threads_per_block = 0; 1277 1278 screen->get_compute_param(screen, PIPE_SHADER_IR_TGSI, 1279 PIPE_COMPUTE_CAP_MAX_VARIABLE_THREADS_PER_BLOCK, 1280 &max_variable_threads_per_block); 1281 1282 for (i = 0; i < 3; i++) { 1283 /* Clamp the values to avoid having a local work group size 1284 * greater than the maximum number of invocations. 1285 */ 1286 consts->MaxComputeVariableGroupSize[i] = 1287 MIN2(consts->MaxComputeWorkGroupSize[i], 1288 max_variable_threads_per_block); 1289 } 1290 consts->MaxComputeVariableGroupInvocations = 1291 max_variable_threads_per_block; 1292 1293 extensions->ARB_compute_variable_group_size = 1294 max_variable_threads_per_block > 0; 1295 } 1296 } 1297 } 1298 1299 if (extensions->EXT_texture_filter_anisotropic && 1300 screen->get_paramf(screen, PIPE_CAPF_MAX_TEXTURE_ANISOTROPY) >= 16.0) 1301 extensions->ARB_texture_filter_anisotropic = GL_TRUE; 1302 1303 extensions->KHR_robustness = extensions->ARB_robust_buffer_access_behavior; 1304 1305 /* If we support ES 3.1, we support the ES3_1_compatibility ext. However 1306 * there's no clean way of telling whether we would support ES 3.1 from 1307 * here, so copy the condition from compute_version_es2 here. A lot of 1308 * these are redunant, but simpler to just have a (near-)exact copy here. 1309 */ 1310 extensions->ARB_ES3_1_compatibility = 1311 extensions->ARB_ES3_compatibility && 1312 extensions->ARB_arrays_of_arrays && 1313 extensions->ARB_compute_shader && 1314 extensions->ARB_draw_indirect && 1315 extensions->ARB_explicit_uniform_location && 1316 extensions->ARB_framebuffer_no_attachments && 1317 extensions->ARB_shader_atomic_counters && 1318 extensions->ARB_shader_image_load_store && 1319 extensions->ARB_shader_image_size && 1320 extensions->ARB_shader_storage_buffer_object && 1321 extensions->ARB_shading_language_packing && 1322 extensions->ARB_stencil_texturing && 1323 extensions->ARB_texture_multisample && 1324 extensions->ARB_gpu_shader5 && 1325 extensions->EXT_shader_integer_mix; 1326 1327 extensions->OES_texture_cube_map_array = 1328 extensions->ARB_ES3_1_compatibility && 1329 extensions->OES_geometry_shader && 1330 extensions->ARB_texture_cube_map_array; 1331 1332 extensions->OES_viewport_array = 1333 extensions->ARB_ES3_1_compatibility && 1334 extensions->OES_geometry_shader && 1335 extensions->ARB_viewport_array; 1336 1337 extensions->OES_primitive_bounding_box = extensions->ARB_ES3_1_compatibility; 1338 consts->NoPrimitiveBoundingBoxOutput = true; 1339 1340 extensions->ANDROID_extension_pack_es31a = 1341 extensions->KHR_texture_compression_astc_ldr && 1342 extensions->KHR_blend_equation_advanced && 1343 extensions->OES_sample_variables && 1344 extensions->ARB_shader_image_load_store && 1345 extensions->ARB_texture_stencil8 && 1346 extensions->ARB_texture_multisample && 1347 extensions->OES_copy_image && 1348 extensions->ARB_draw_buffers_blend && 1349 extensions->OES_geometry_shader && 1350 extensions->ARB_gpu_shader5 && 1351 extensions->OES_primitive_bounding_box && 1352 extensions->ARB_tessellation_shader && 1353 extensions->ARB_texture_border_clamp && 1354 extensions->OES_texture_buffer && 1355 extensions->OES_texture_cube_map_array && 1356 extensions->EXT_texture_sRGB_decode; 1357 1358 /* Same deal as for ARB_ES3_1_compatibility - this has to be computed 1359 * before overall versions are selected. Also it's actually a subset of ES 1360 * 3.2, since it doesn't require ASTC or advanced blending. 1361 */ 1362 extensions->ARB_ES3_2_compatibility = 1363 extensions->ARB_ES3_1_compatibility && 1364 extensions->KHR_robustness && 1365 extensions->ARB_copy_image && 1366 extensions->ARB_draw_buffers_blend && 1367 extensions->ARB_draw_elements_base_vertex && 1368 extensions->OES_geometry_shader && 1369 extensions->ARB_gpu_shader5 && 1370 extensions->ARB_sample_shading && 1371 extensions->ARB_tessellation_shader && 1372 extensions->ARB_texture_border_clamp && 1373 extensions->OES_texture_buffer && 1374 extensions->ARB_texture_cube_map_array && 1375 extensions->ARB_texture_stencil8 && 1376 extensions->ARB_texture_multisample; 1377 } 1378