1c6499a741c99394e81d1d86ffd066f3d9749875cBrian/************************************************************************** 2c6499a741c99394e81d1d86ffd066f3d9749875cBrian * 3c6499a741c99394e81d1d86ffd066f3d9749875cBrian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4fd2492d24447e461f36982da268caf0317885967Roland Scheidegger * Copyright (c) 2008 VMware, Inc. 5c6499a741c99394e81d1d86ffd066f3d9749875cBrian * All Rights Reserved. 6c6499a741c99394e81d1d86ffd066f3d9749875cBrian * 7c6499a741c99394e81d1d86ffd066f3d9749875cBrian * Permission is hereby granted, free of charge, to any person obtaining a 8c6499a741c99394e81d1d86ffd066f3d9749875cBrian * copy of this software and associated documentation files (the 9c6499a741c99394e81d1d86ffd066f3d9749875cBrian * "Software"), to deal in the Software without restriction, including 10c6499a741c99394e81d1d86ffd066f3d9749875cBrian * without limitation the rights to use, copy, modify, merge, publish, 11c6499a741c99394e81d1d86ffd066f3d9749875cBrian * distribute, sub license, and/or sell copies of the Software, and to 12c6499a741c99394e81d1d86ffd066f3d9749875cBrian * permit persons to whom the Software is furnished to do so, subject to 13c6499a741c99394e81d1d86ffd066f3d9749875cBrian * the following conditions: 14c6499a741c99394e81d1d86ffd066f3d9749875cBrian * 15c6499a741c99394e81d1d86ffd066f3d9749875cBrian * The above copyright notice and this permission notice (including the 16c6499a741c99394e81d1d86ffd066f3d9749875cBrian * next paragraph) shall be included in all copies or substantial portions 17c6499a741c99394e81d1d86ffd066f3d9749875cBrian * of the Software. 18c6499a741c99394e81d1d86ffd066f3d9749875cBrian * 19c6499a741c99394e81d1d86ffd066f3d9749875cBrian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20c6499a741c99394e81d1d86ffd066f3d9749875cBrian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21c6499a741c99394e81d1d86ffd066f3d9749875cBrian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 22c6499a741c99394e81d1d86ffd066f3d9749875cBrian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 23c6499a741c99394e81d1d86ffd066f3d9749875cBrian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24c6499a741c99394e81d1d86ffd066f3d9749875cBrian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 25c6499a741c99394e81d1d86ffd066f3d9749875cBrian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26c6499a741c99394e81d1d86ffd066f3d9749875cBrian * 27c6499a741c99394e81d1d86ffd066f3d9749875cBrian **************************************************************************/ 28c6499a741c99394e81d1d86ffd066f3d9749875cBrian 29c6499a741c99394e81d1d86ffd066f3d9749875cBrian#include "main/imports.h" 30c6499a741c99394e81d1d86ffd066f3d9749875cBrian#include "main/context.h" 31c6499a741c99394e81d1d86ffd066f3d9749875cBrian#include "main/macros.h" 32edc09358f72cd48cb2315daf23c82e7646aeaea3Vinson Lee#include "main/mfeatures.h" 333bb41e7b2d359e02f6a1ad8df6be52d9aea7d296Brian Paul#include "main/version.h" 34c6499a741c99394e81d1d86ffd066f3d9749875cBrian 35c6499a741c99394e81d1d86ffd066f3d9749875cBrian#include "pipe/p_context.h" 36c6499a741c99394e81d1d86ffd066f3d9749875cBrian#include "pipe/p_defines.h" 378383f798b41df9a305e0a33afe8afa028d5d5dfbBrian#include "pipe/p_screen.h" 38c6499a741c99394e81d1d86ffd066f3d9749875cBrian 39c6499a741c99394e81d1d86ffd066f3d9749875cBrian#include "st_context.h" 40c6499a741c99394e81d1d86ffd066f3d9749875cBrian#include "st_extensions.h" 41c6499a741c99394e81d1d86ffd066f3d9749875cBrian 42c6499a741c99394e81d1d86ffd066f3d9749875cBrian 4354507125e735ffa595e252282eaabf38095c21e1Alan Hourihanestatic int _min(int a, int b) 44e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian{ 45e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian return (a < b) ? a : b; 46e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian} 47e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian 4818ec140ef27b6488bea9d54e21b08b0a3afbcafeJosé Fonsecastatic float _maxf(float a, float b) 4944254b92480115e5c8a2d5cf78f99195c03701ebBrian{ 5044254b92480115e5c8a2d5cf78f99195c03701ebBrian return (a > b) ? a : b; 5144254b92480115e5c8a2d5cf78f99195c03701ebBrian} 5244254b92480115e5c8a2d5cf78f99195c03701ebBrian 5354507125e735ffa595e252282eaabf38095c21e1Alan Hourihanestatic int _clamp(int a, int min, int max) 54c6499a741c99394e81d1d86ffd066f3d9749875cBrian{ 55e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian if (a < min) 56e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian return min; 57e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian else if (a > max) 58e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian return max; 59e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian else 60e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian return a; 61c6499a741c99394e81d1d86ffd066f3d9749875cBrian} 62c6499a741c99394e81d1d86ffd066f3d9749875cBrian 63c6499a741c99394e81d1d86ffd066f3d9749875cBrian 64e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian/** 65e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian * Query driver to get implementation limits. 66e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian * Note that we have to limit/clamp against Mesa's internal limits too. 67e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian */ 68c6499a741c99394e81d1d86ffd066f3d9749875cBrianvoid st_init_limits(struct st_context *st) 69c6499a741c99394e81d1d86ffd066f3d9749875cBrian{ 708383f798b41df9a305e0a33afe8afa028d5d5dfbBrian struct pipe_screen *screen = st->pipe->screen; 71e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian struct gl_constants *c = &st->ctx->Const; 72c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul gl_shader_type sh; 73e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian 74e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian c->MaxTextureLevels 7554507125e735ffa595e252282eaabf38095c21e1Alan Hourihane = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS), 76e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian MAX_TEXTURE_LEVELS); 77c6499a741c99394e81d1d86ffd066f3d9749875cBrian 78e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian c->Max3DTextureLevels 7954507125e735ffa595e252282eaabf38095c21e1Alan Hourihane = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_3D_LEVELS), 80e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian MAX_3D_TEXTURE_LEVELS); 81c6499a741c99394e81d1d86ffd066f3d9749875cBrian 82e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian c->MaxCubeTextureLevels 8354507125e735ffa595e252282eaabf38095c21e1Alan Hourihane = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS), 84e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian MAX_CUBE_TEXTURE_LEVELS); 85c6499a741c99394e81d1d86ffd066f3d9749875cBrian 86e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian c->MaxTextureRectSize 8754507125e735ffa595e252282eaabf38095c21e1Alan Hourihane = _min(1 << (c->MaxTextureLevels - 1), MAX_TEXTURE_RECT_SIZE); 88c6499a741c99394e81d1d86ffd066f3d9749875cBrian 89379429137238e79296b8222c0e13d7d961910633Marek Olšák c->MaxArrayTextureLayers 90379429137238e79296b8222c0e13d7d961910633Marek Olšák = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS); 91379429137238e79296b8222c0e13d7d961910633Marek Olšák 92d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul c->MaxTextureImageUnits 93f5bfe54a34d9c8cd5de2b096d0e8486fe0d990a7Marek Olšák = _min(screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, 94f5bfe54a34d9c8cd5de2b096d0e8486fe0d990a7Marek Olšák PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS), 95e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian MAX_TEXTURE_IMAGE_UNITS); 96c6499a741c99394e81d1d86ffd066f3d9749875cBrian 971d9360b67829a37b369e32c894183db1cecf827bBrian c->MaxVertexTextureImageUnits 98f5bfe54a34d9c8cd5de2b096d0e8486fe0d990a7Marek Olšák = _min(screen->get_shader_param(screen, PIPE_SHADER_VERTEX, 99f5bfe54a34d9c8cd5de2b096d0e8486fe0d990a7Marek Olšák PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS), 10015a3fdb63e0511860ee84c168b84dd0bcfca6094Brian Paul MAX_VERTEX_TEXTURE_IMAGE_UNITS); 1011d9360b67829a37b369e32c894183db1cecf827bBrian 102853d4807fe220b17cf5af5a76b24f2466238013bMichal Krol c->MaxCombinedTextureImageUnits 103853d4807fe220b17cf5af5a76b24f2466238013bMichal Krol = _min(screen->get_param(screen, PIPE_CAP_MAX_COMBINED_SAMPLERS), 104853d4807fe220b17cf5af5a76b24f2466238013bMichal Krol MAX_COMBINED_TEXTURE_IMAGE_UNITS); 105853d4807fe220b17cf5af5a76b24f2466238013bMichal Krol 1066cbaa2226fa1237b9f314828fbbc1c8db6509de8Brian Paul c->MaxTextureCoordUnits 1076cbaa2226fa1237b9f314828fbbc1c8db6509de8Brian Paul = _min(c->MaxTextureImageUnits, MAX_TEXTURE_COORD_UNITS); 108d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul 1096cbaa2226fa1237b9f314828fbbc1c8db6509de8Brian Paul c->MaxTextureUnits = _min(c->MaxTextureImageUnits, c->MaxTextureCoordUnits); 110d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul 111d7d4a1955b4f1fcafb5efab06a9f982fccefa19bBrian Paul /* Define max viewport size and max renderbuffer size in terms of 112d7d4a1955b4f1fcafb5efab06a9f982fccefa19bBrian Paul * max texture size (note: max tex RECT size = max tex 2D size). 113d7d4a1955b4f1fcafb5efab06a9f982fccefa19bBrian Paul * If this isn't true for some hardware we'll need new PIPE_CAP_ queries. 114d7d4a1955b4f1fcafb5efab06a9f982fccefa19bBrian Paul */ 115d7d4a1955b4f1fcafb5efab06a9f982fccefa19bBrian Paul c->MaxViewportWidth = 116d7d4a1955b4f1fcafb5efab06a9f982fccefa19bBrian Paul c->MaxViewportHeight = 117d7d4a1955b4f1fcafb5efab06a9f982fccefa19bBrian Paul c->MaxRenderbufferSize = c->MaxTextureRectSize; 118d7d4a1955b4f1fcafb5efab06a9f982fccefa19bBrian Paul 119e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian c->MaxDrawBuffers 12054507125e735ffa595e252282eaabf38095c21e1Alan Hourihane = _clamp(screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS), 121e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian 1, MAX_DRAW_BUFFERS); 12244254b92480115e5c8a2d5cf78f99195c03701ebBrian 123a21df965075f6fa1bf27039490ad65b9f78548e6Dave Airlie c->MaxDualSourceDrawBuffers 124a21df965075f6fa1bf27039490ad65b9f78548e6Dave Airlie = _clamp(screen->get_param(screen, PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS), 125a21df965075f6fa1bf27039490ad65b9f78548e6Dave Airlie 0, MAX_DRAW_BUFFERS); 126a21df965075f6fa1bf27039490ad65b9f78548e6Dave Airlie 12744254b92480115e5c8a2d5cf78f99195c03701ebBrian c->MaxLineWidth 128bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšák = _maxf(1.0f, screen->get_paramf(screen, 129bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšák PIPE_CAPF_MAX_LINE_WIDTH)); 13044254b92480115e5c8a2d5cf78f99195c03701ebBrian c->MaxLineWidthAA 131bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšák = _maxf(1.0f, screen->get_paramf(screen, 132bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšák PIPE_CAPF_MAX_LINE_WIDTH_AA)); 13344254b92480115e5c8a2d5cf78f99195c03701ebBrian 13444254b92480115e5c8a2d5cf78f99195c03701ebBrian c->MaxPointSize 135bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšák = _maxf(1.0f, screen->get_paramf(screen, 136bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšák PIPE_CAPF_MAX_POINT_WIDTH)); 13744254b92480115e5c8a2d5cf78f99195c03701ebBrian c->MaxPointSizeAA 138bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšák = _maxf(1.0f, screen->get_paramf(screen, 139bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšák PIPE_CAPF_MAX_POINT_WIDTH_AA)); 140dd7be07c9685012b3e9fdfbaa13dc638abf6a9d1Roland Scheidegger /* called after _mesa_create_context/_mesa_init_point, fix default user 141dd7be07c9685012b3e9fdfbaa13dc638abf6a9d1Roland Scheidegger * settable max point size up 142dd7be07c9685012b3e9fdfbaa13dc638abf6a9d1Roland Scheidegger */ 143dd7be07c9685012b3e9fdfbaa13dc638abf6a9d1Roland Scheidegger st->ctx->Point.MaxSize = MAX2(c->MaxPointSize, c->MaxPointSizeAA); 1442c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger /* these are not queryable. Note that GL basically mandates a 1.0 minimum 1452c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger * for non-aa sizes, but we can go down to 0.0 for aa points. 1462c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger */ 1472c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger c->MinPointSize = 1.0f; 1482c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger c->MinPointSizeAA = 0.0f; 14944254b92480115e5c8a2d5cf78f99195c03701ebBrian 15044254b92480115e5c8a2d5cf78f99195c03701ebBrian c->MaxTextureMaxAnisotropy 151bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšák = _maxf(2.0f, screen->get_paramf(screen, 152bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšák PIPE_CAPF_MAX_TEXTURE_ANISOTROPY)); 15344254b92480115e5c8a2d5cf78f99195c03701ebBrian 15444254b92480115e5c8a2d5cf78f99195c03701ebBrian c->MaxTextureLodBias 155bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšák = screen->get_paramf(screen, PIPE_CAPF_MAX_TEXTURE_LOD_BIAS); 1564650b35846e8e87fb0d74573a5f66452bb449b4bBrian 157b54225ccd6d3bc1b678e27c2f00ebddf5bf1046dBrian c->MaxDrawBuffers 158b54225ccd6d3bc1b678e27c2f00ebddf5bf1046dBrian = CLAMP(screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS), 159b54225ccd6d3bc1b678e27c2f00ebddf5bf1046dBrian 1, MAX_DRAW_BUFFERS); 16002edc8da36d6e01635bcfbb5073f0f718de96c37Brian Paul 1618b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller c->QuadsFollowProvokingVertexConvention = screen->get_param( 1628b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller screen, PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION); 163dad962bafe8ffd7fdb35c28cfb8bbd5a297c8083José Fonseca 164c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul for (sh = 0; sh < MESA_SHADER_TYPES; ++sh) { 165c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul struct gl_shader_compiler_options *options = 166c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul &st->ctx->ShaderCompilerOptions[sh]; 1679f7f7b3ff87e756a5d42eb4c6a953ec33e128f89Vinson Lee struct gl_program_constants *pc; 168c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul 169c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul switch (sh) { 170a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri case PIPE_SHADER_FRAGMENT: 171a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri pc = &c->FragmentProgram; 172a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri break; 173a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri case PIPE_SHADER_VERTEX: 174a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri pc = &c->VertexProgram; 175a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri break; 176a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri case PIPE_SHADER_GEOMETRY: 177a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri pc = &c->GeometryProgram; 178a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri break; 1799f7f7b3ff87e756a5d42eb4c6a953ec33e128f89Vinson Lee default: 1809f7f7b3ff87e756a5d42eb4c6a953ec33e128f89Vinson Lee assert(0); 1819f7f7b3ff87e756a5d42eb4c6a953ec33e128f89Vinson Lee continue; 182a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri } 183a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri 184c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul pc->MaxNativeInstructions = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INSTRUCTIONS); 185c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul pc->MaxNativeAluInstructions = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS); 186c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul pc->MaxNativeTexInstructions = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS); 187c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul pc->MaxNativeTexIndirections = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS); 188c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul pc->MaxNativeAttribs = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INPUTS); 189c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul pc->MaxNativeTemps = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_TEMPS); 190c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul pc->MaxNativeAddressRegs = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_ADDRS); 191c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul pc->MaxNativeParameters = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_CONSTS); 192e7c74a7dfab789496761226fe62a08f2d9fea5c7Marek Olšák pc->MaxUniformComponents = 4 * MIN2(pc->MaxNativeParameters, MAX_UNIFORMS); 193f9cc6acbfa6f6f91b29a0601436d91a330fdce79Brian Paul /* raise MaxParameters if native support is higher */ 194f9cc6acbfa6f6f91b29a0601436d91a330fdce79Brian Paul pc->MaxParameters = MAX2(pc->MaxParameters, pc->MaxNativeParameters); 195a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri 196b94a926f396d366b6bb5d24b32dd93ffb7609205Brian Paul /* Gallium doesn't really care about local vs. env parameters so use the 197b94a926f396d366b6bb5d24b32dd93ffb7609205Brian Paul * same limits. 198b94a926f396d366b6bb5d24b32dd93ffb7609205Brian Paul */ 199f37a5081b229b020553c45e32e9888af77cfd3d6Marek Olšák pc->MaxLocalParams = MIN2(pc->MaxParameters, MAX_PROGRAM_LOCAL_PARAMS); 200f37a5081b229b020553c45e32e9888af77cfd3d6Marek Olšák pc->MaxEnvParams = MIN2(pc->MaxParameters, MAX_PROGRAM_ENV_PARAMS); 201b94a926f396d366b6bb5d24b32dd93ffb7609205Brian Paul 202fbc7c9b7a9d9df979ea82136d2b74121e5d4346eLuca Barbieri options->EmitNoNoise = TRUE; 203fbc7c9b7a9d9df979ea82136d2b74121e5d4346eLuca Barbieri 204b37459388b22fb6a831d45bc08e51cdb7b9c610cLuca Barbieri /* TODO: make these more fine-grained if anyone needs it */ 205488fe51cf823ccd137c667f1e92dd86f8323b723Bryan Cain options->MaxIfDepth = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH); 206c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul options->EmitNoLoops = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH); 207c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul options->EmitNoFunctions = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_SUBROUTINES); 208c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul options->EmitNoMainReturn = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_SUBROUTINES); 209b37459388b22fb6a831d45bc08e51cdb7b9c610cLuca Barbieri 210c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul options->EmitNoCont = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED); 211b37459388b22fb6a831d45bc08e51cdb7b9c610cLuca Barbieri 212c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul options->EmitNoIndirectInput = !screen->get_shader_param(screen, sh, 213cbfdf262ccf8b573f1fa4c0065a8eb1fb87d93daMarek Olšák PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR); 214c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul options->EmitNoIndirectOutput = !screen->get_shader_param(screen, sh, 215cbfdf262ccf8b573f1fa4c0065a8eb1fb87d93daMarek Olšák PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR); 216c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul options->EmitNoIndirectTemp = !screen->get_shader_param(screen, sh, 217cbfdf262ccf8b573f1fa4c0065a8eb1fb87d93daMarek Olšák PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR); 218c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul options->EmitNoIndirectUniform = !screen->get_shader_param(screen, sh, 219cbfdf262ccf8b573f1fa4c0065a8eb1fb87d93daMarek Olšák PIPE_SHADER_CAP_INDIRECT_CONST_ADDR); 220cbfdf262ccf8b573f1fa4c0065a8eb1fb87d93daMarek Olšák 22148aa7725893ee75af10b8519e8a018e94334c7ccBrian Paul if (options->EmitNoLoops) 222c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul options->MaxUnrollIterations = MIN2(screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INSTRUCTIONS), 65536); 22320836c81851e0df29a8ee9c86e5e5388738c840bBrian Paul else 22420836c81851e0df29a8ee9c86e5e5388738c840bBrian Paul options->MaxUnrollIterations = 255; /* SM3 limit */ 2257e63b613a5a067462c450338e0bdce5b5976f6f1Marcin Slusarz options->LowerClipDistance = true; 226a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri } 227007bac83312b29061753e625edfd45ccab9ecc9cMarek Olšák 2281ded658ce074a85bc08c989ff17840b840ff3051Marek Olšák /* PIPE_SHADER_CAP_MAX_INPUTS for the FS specifies the maximum number 2291ded658ce074a85bc08c989ff17840b840ff3051Marek Olšák * of inputs. It's always 2 colors + N generic inputs. */ 2301ded658ce074a85bc08c989ff17840b840ff3051Marek Olšák c->MaxVarying = screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, 2311ded658ce074a85bc08c989ff17840b840ff3051Marek Olšák PIPE_SHADER_CAP_MAX_INPUTS); 232e746a6bb9a6c9f797d1b40ed22b2f296f8fa5aacBrian Paul c->MaxVarying = MIN2(c->MaxVarying, MAX_VARYING); 233e7087175f8a04f777403366fb34b58edd00f4d60Brian Paul 2342a0126932b320806e030c1c085791e257516e0cdMarek Olšák c->MinProgramTexelOffset = screen->get_param(screen, PIPE_CAP_MIN_TEXEL_OFFSET); 2352a0126932b320806e030c1c085791e257516e0cdMarek Olšák c->MaxProgramTexelOffset = screen->get_param(screen, PIPE_CAP_MAX_TEXEL_OFFSET); 2362a0126932b320806e030c1c085791e257516e0cdMarek Olšák 2372a0126932b320806e030c1c085791e257516e0cdMarek Olšák c->UniformBooleanTrue = ~0; 2389c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt 23915ac66e331abdab12e882d80a6b4f647bc905298Marek Olšák c->MaxTransformFeedbackBuffers = 2401b9577b833db28651e89e5c12559c7af5dde8822Marek Olšák screen->get_param(screen, PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS); 24115ac66e331abdab12e882d80a6b4f647bc905298Marek Olšák c->MaxTransformFeedbackBuffers = MIN2(c->MaxTransformFeedbackBuffers, MAX_FEEDBACK_BUFFERS); 242c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák c->MaxTransformFeedbackSeparateComponents = 243c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák screen->get_param(screen, PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS); 244c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák c->MaxTransformFeedbackInterleavedComponents = 245c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák screen->get_param(screen, PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS); 246c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák 2479c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt c->StripTextureBorder = GL_TRUE; 248df809ae92343bb83c162ea4c807cefb67686717dMarek Olšák 249df809ae92343bb83c162ea4c807cefb67686717dMarek Olšák c->GLSLSkipStrictMaxUniformLimitCheck = 250df809ae92343bb83c162ea4c807cefb67686717dMarek Olšák screen->get_param(screen, PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS); 251df809ae92343bb83c162ea4c807cefb67686717dMarek Olšák 252df809ae92343bb83c162ea4c807cefb67686717dMarek Olšák c->GLSLSkipStrictMaxVaryingLimitCheck = 253df809ae92343bb83c162ea4c807cefb67686717dMarek Olšák screen->get_param(screen, PIPE_CAP_TGSI_CAN_COMPACT_VARYINGS); 254c6499a741c99394e81d1d86ffd066f3d9749875cBrian} 255c6499a741c99394e81d1d86ffd066f3d9749875cBrian 256c6499a741c99394e81d1d86ffd066f3d9749875cBrian 25795739f19ccc8d3915c437238ca057ddbecd193c6Bryan Cainstatic GLboolean st_get_s3tc_override(void) 25895739f19ccc8d3915c437238ca057ddbecd193c6Bryan Cain{ 25995739f19ccc8d3915c437238ca057ddbecd193c6Bryan Cain const char *override = _mesa_getenv("force_s3tc_enable"); 26095739f19ccc8d3915c437238ca057ddbecd193c6Bryan Cain if (override && !strcmp(override, "true")) 26195739f19ccc8d3915c437238ca057ddbecd193c6Bryan Cain return GL_TRUE; 26295739f19ccc8d3915c437238ca057ddbecd193c6Bryan Cain return GL_FALSE; 26395739f19ccc8d3915c437238ca057ddbecd193c6Bryan Cain} 26495739f19ccc8d3915c437238ca057ddbecd193c6Bryan Cain 265c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák/** 266c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák * Given a member \c x of struct gl_extensions, return offset of 267c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák * \c x in bytes. 268c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák */ 269c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák#define o(x) offsetof(struct gl_extensions, x) 270c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák 271c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák 272c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšákstruct st_extension_cap_mapping { 273c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák int extension_offset; 274c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák int cap; 275c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák}; 276c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák 27741a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšákstruct st_extension_format_mapping { 27841a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák int extension_offset[2]; 27941a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák enum pipe_format format[8]; 28041a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 28141a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák /* If TRUE, at least one format must be supported for the extensions to be 28241a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák * advertised. If FALSE, all the formats must be supported. */ 28341a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák GLboolean need_at_least_one; 28441a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák}; 28541a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 28641a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák/** 28741a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák * Enable extensions if certain pipe formats are supported by the driver. 28841a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák * What extensions will be enabled and what formats must be supported is 28941a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák * described by the array of st_extension_format_mapping. 29041a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák * 29141a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák * target and bind_flags are passed to is_format_supported. 29241a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák */ 29341a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšákstatic void init_format_extensions(struct st_context *st, 29441a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák const struct st_extension_format_mapping *mapping, 29541a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák unsigned num_mappings, 29641a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák enum pipe_texture_target target, 29741a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák unsigned bind_flags) 29841a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák{ 29941a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák struct pipe_screen *screen = st->pipe->screen; 30041a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák GLboolean *extensions = (GLboolean *) &st->ctx->Extensions; 30141a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák int i, j; 30241a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák int num_formats = Elements(mapping->format); 30341a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák int num_ext = Elements(mapping->extension_offset); 30441a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 30541a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák for (i = 0; i < num_mappings; i++) { 30641a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák int num_supported = 0; 30741a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 30841a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák /* Examine each format in the list. */ 30941a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák for (j = 0; j < num_formats && mapping[i].format[j]; j++) { 31041a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák if (screen->is_format_supported(screen, mapping[i].format[j], 31141a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák target, 0, bind_flags)) { 31241a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák num_supported++; 31341a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák } 31441a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák } 31541a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 31641a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák if (!num_supported || 31741a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák (!mapping[i].need_at_least_one && num_supported != j)) { 31841a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák continue; 31941a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák } 32041a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 32141a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák /* Enable all extensions in the list. */ 32241a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák for (j = 0; j < num_ext && mapping[i].extension_offset[j]; j++) 32341a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák extensions[mapping[i].extension_offset[j]] = GL_TRUE; 32441a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák } 32541a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák} 32695739f19ccc8d3915c437238ca057ddbecd193c6Bryan Cain 327c6499a741c99394e81d1d86ffd066f3d9749875cBrian/** 3286b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul * Use pipe_screen::get_param() to query PIPE_CAP_ values to determine 3296b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul * which GL extensions are supported. 3306b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul * Quite a few extensions are always supported because they are standard 3316b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul * features or can be built on top of other gallium features. 3326b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul * Some fine tuning may still be needed. 333c6499a741c99394e81d1d86ffd066f3d9749875cBrian */ 334c6499a741c99394e81d1d86ffd066f3d9749875cBrianvoid st_init_extensions(struct st_context *st) 335c6499a741c99394e81d1d86ffd066f3d9749875cBrian{ 3368383f798b41df9a305e0a33afe8afa028d5d5dfbBrian struct pipe_screen *screen = st->pipe->screen; 337f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx = st->ctx; 338171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák int i, glsl_feature_level; 339c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák GLboolean *extensions = (GLboolean *) &ctx->Extensions; 340c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák 341c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák static const struct st_extension_cap_mapping cap_mapping[] = { 342c4c8c7a8f9757f8670ec9cde514cee11ed33c4cbFredrik Höglund { o(ARB_base_instance), PIPE_CAP_START_INSTANCE }, 343c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(ARB_depth_clamp), PIPE_CAP_DEPTH_CLIP_DISABLE }, 344c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(ARB_depth_texture), PIPE_CAP_TEXTURE_SHADOW_MAP }, 345c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(ARB_draw_buffers_blend), PIPE_CAP_INDEP_BLEND_FUNC }, 346c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(ARB_draw_instanced), PIPE_CAP_TGSI_INSTANCEID }, 347c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(ARB_fragment_program_shadow), PIPE_CAP_TEXTURE_SHADOW_MAP }, 348c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(ARB_instanced_arrays), PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR }, 349c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(ARB_occlusion_query), PIPE_CAP_OCCLUSION_QUERY }, 350c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(ARB_occlusion_query2), PIPE_CAP_OCCLUSION_QUERY }, 351c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(ARB_point_sprite), PIPE_CAP_POINT_SPRITE }, 352c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(ARB_seamless_cube_map), PIPE_CAP_SEAMLESS_CUBE_MAP }, 353c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(ARB_shader_stencil_export), PIPE_CAP_SHADER_STENCIL_EXPORT }, 354c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(ARB_shader_texture_lod), PIPE_CAP_SM3 }, 355c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(ARB_shadow), PIPE_CAP_TEXTURE_SHADOW_MAP }, 356c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(ARB_texture_non_power_of_two), PIPE_CAP_NPOT_TEXTURES }, 357c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(ARB_transform_feedback2), PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME }, 35863d8c8baa99560c7a051b88afae645e60f07bc8fMarek Olšák { o(ARB_transform_feedback3), PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME }, 359c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák 360c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(EXT_blend_equation_separate), PIPE_CAP_BLEND_EQUATION_SEPARATE }, 361c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(EXT_draw_buffers2), PIPE_CAP_INDEP_BLEND_ENABLE }, 362c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(EXT_shadow_funcs), PIPE_CAP_TEXTURE_SHADOW_MAP }, 363c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(EXT_stencil_two_side), PIPE_CAP_TWO_SIDED_STENCIL }, 364c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(EXT_texture_array), PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS }, 365c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(EXT_texture_filter_anisotropic), PIPE_CAP_ANISOTROPIC_FILTER }, 366c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(EXT_texture_mirror_clamp), PIPE_CAP_TEXTURE_MIRROR_CLAMP }, 367c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(EXT_texture_swizzle), PIPE_CAP_TEXTURE_SWIZZLE }, 368c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(EXT_timer_query), PIPE_CAP_TIMER_QUERY }, 369c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(EXT_transform_feedback), PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS }, 370c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák 371c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(AMD_seamless_cubemap_per_texture), PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE }, 372c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(ATI_separate_stencil), PIPE_CAP_TWO_SIDED_STENCIL }, 373c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(ATI_texture_mirror_once), PIPE_CAP_TEXTURE_MIRROR_CLAMP }, 374c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(NV_conditional_render), PIPE_CAP_CONDITIONAL_RENDER }, 375c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(NV_texture_barrier), PIPE_CAP_TEXTURE_BARRIER }, 376c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák /* GL_NV_point_sprite is not supported by gallium because we don't 377c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák * support the GL_POINT_SPRITE_R_MODE_NV option. */ 378c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák { o(MESA_texture_array), PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS }, 379c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák }; 3802a0126932b320806e030c1c085791e257516e0cdMarek Olšák 38141a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák /* Required: render target and sampler support */ 38241a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák static const struct st_extension_format_mapping rendertarget_mapping[] = { 38341a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { { o(ARB_texture_float) }, 38441a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { PIPE_FORMAT_R32G32B32A32_FLOAT, 38541a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_R16G16B16A16_FLOAT } }, 38641a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 38741a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { { o(ARB_texture_rgb10_a2ui) }, 38841a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { PIPE_FORMAT_B10G10R10A2_UINT } }, 38941a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 39041a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { { o(EXT_framebuffer_sRGB) }, 39141a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { PIPE_FORMAT_A8B8G8R8_SRGB, 39241a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_B8G8R8A8_SRGB }, 39341a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák GL_TRUE }, /* at least one format must be supported */ 39441a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 39541a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { { o(EXT_packed_float) }, 39641a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { PIPE_FORMAT_R11G11B10_FLOAT } }, 39741a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 39841a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { { o(EXT_texture_integer) }, 39941a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { PIPE_FORMAT_R32G32B32A32_UINT, 40041a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_R32G32B32A32_SINT } }, 40141a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák }; 40241a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 40341a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák /* Required: depth stencil and sampler support */ 40441a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák static const struct st_extension_format_mapping depthstencil_mapping[] = { 40541a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { { o(ARB_depth_buffer_float) }, 40641a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { PIPE_FORMAT_Z32_FLOAT, 40741a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_Z32_FLOAT_S8X24_UINT } }, 40841a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 40941a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { { o(ARB_framebuffer_object), 41041a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák o(EXT_packed_depth_stencil) }, 41141a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { PIPE_FORMAT_S8_UINT_Z24_UNORM, 41241a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_Z24_UNORM_S8_UINT }, 41341a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák GL_TRUE }, /* at least one format must be supported */ 41441a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák }; 41541a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 41641a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák /* Required: sampler support */ 41741a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák static const struct st_extension_format_mapping texture_mapping[] = { 41841a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { { o(ARB_texture_compression_rgtc) }, 41941a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { PIPE_FORMAT_RGTC1_UNORM, 42041a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_RGTC1_SNORM, 42141a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_RGTC2_UNORM, 42241a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_RGTC2_SNORM } }, 42341a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 42441a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { { o(ARB_texture_rg) }, 42541a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { PIPE_FORMAT_R8G8_UNORM } }, 42641a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 42741a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { { o(EXT_texture_compression_latc) }, 42841a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { PIPE_FORMAT_LATC1_UNORM, 42941a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_LATC1_SNORM, 43041a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_LATC2_UNORM, 43141a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_LATC2_SNORM } }, 43241a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 43341a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { { o(EXT_texture_compression_s3tc), 43441a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák o(S3_s3tc) }, 43541a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { PIPE_FORMAT_DXT1_RGB, 43641a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_DXT1_RGBA, 43741a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_DXT3_RGBA, 43841a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_DXT5_RGBA } }, 43941a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 44041a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { { o(EXT_texture_shared_exponent) }, 44141a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { PIPE_FORMAT_R9G9B9E5_FLOAT } }, 44241a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 44341a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { { o(EXT_texture_snorm) }, 44441a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { PIPE_FORMAT_R8G8B8A8_SNORM } }, 44541a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 44641a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { { o(EXT_texture_sRGB), 44741a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák o(EXT_texture_sRGB_decode) }, 44841a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { PIPE_FORMAT_A8B8G8R8_SRGB, 44941a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_B8G8R8A8_SRGB }, 45041a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák GL_TRUE }, /* at least one format must be supported */ 45141a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 45241a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { { o(ATI_texture_compression_3dc) }, 45341a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { PIPE_FORMAT_LATC2_UNORM } }, 45441a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 45541a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { { o(MESA_ycbcr_texture) }, 45641a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { PIPE_FORMAT_UYVY, 45741a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_YUYV }, 45841a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák GL_TRUE }, /* at least one format must be supported */ 45941a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 46041a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { { o(OES_compressed_ETC1_RGB8_texture) }, 46141a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { PIPE_FORMAT_ETC1_RGB8 } }, 46241a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák }; 46341a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 46441a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák /* Required: vertex fetch support. */ 46541a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák static const struct st_extension_format_mapping vertex_mapping[] = { 46641a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { { o(ARB_vertex_type_2_10_10_10_rev) }, 46741a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák { PIPE_FORMAT_R10G10B10A2_UNORM, 46841a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_B10G10R10A2_UNORM, 46941a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_R10G10B10A2_SNORM, 47041a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_B10G10R10A2_SNORM, 47141a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_R10G10B10A2_USCALED, 47241a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_B10G10R10A2_USCALED, 47341a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_R10G10B10A2_SSCALED, 47441a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_FORMAT_B10G10R10A2_SSCALED } }, 47541a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák }; 47641a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 477c6499a741c99394e81d1d86ffd066f3d9749875cBrian /* 478c6499a741c99394e81d1d86ffd066f3d9749875cBrian * Extensions that are supported by all Gallium drivers: 479c6499a741c99394e81d1d86ffd066f3d9749875cBrian */ 4803e3737e9e2548ae751236067cca2a79ad98dc2ddMarek Olšák ctx->Extensions.ARB_ES2_compatibility = GL_TRUE; 481dd174ea2155ded567494448ffc5de7e022eabc5aBrian Paul ctx->Extensions.ARB_copy_buffer = GL_TRUE; 4825ed6627ceb82845a7b578419b3cd4168ad0106d3Marek Olšák ctx->Extensions.ARB_draw_elements_base_vertex = GL_TRUE; 4832a0126932b320806e030c1c085791e257516e0cdMarek Olšák ctx->Extensions.ARB_explicit_attrib_location = GL_TRUE; 48462c673b6ac65d27ed83acc92434874b45f75db5cLuca Barbieri ctx->Extensions.ARB_fragment_coord_conventions = GL_TRUE; 485cb0ea416bda30a7f7bced78e1edde806fbcb7577Brian Paul ctx->Extensions.ARB_fragment_program = GL_TRUE; 4862a0126932b320806e030c1c085791e257516e0cdMarek Olšák ctx->Extensions.ARB_fragment_shader = GL_TRUE; 48773e8a2738743035e1347571ba630747d2ec33a2dMarek Olšák ctx->Extensions.ARB_half_float_pixel = GL_TRUE; 488a78fd815d4f3d3a1da7cf63375fd90c03d6e9ad6Marek Olšák ctx->Extensions.ARB_half_float_vertex = GL_TRUE; 4898d0f72e8f901e12841408b95963d43684fb6ce48Brian Paul ctx->Extensions.ARB_map_buffer_range = GL_TRUE; 4902a0126932b320806e030c1c085791e257516e0cdMarek Olšák ctx->Extensions.ARB_shader_objects = GL_TRUE; 4912a0126932b320806e030c1c085791e257516e0cdMarek Olšák ctx->Extensions.ARB_shading_language_100 = GL_TRUE; 4926c4447e6a8ecfcfb094ab2ad8b7371dfa2b7d7bbBrian ctx->Extensions.ARB_texture_border_clamp = GL_TRUE; /* XXX temp */ 493c6499a741c99394e81d1d86ffd066f3d9749875cBrian ctx->Extensions.ARB_texture_cube_map = GL_TRUE; 494c6499a741c99394e81d1d86ffd066f3d9749875cBrian ctx->Extensions.ARB_texture_env_combine = GL_TRUE; 495c6499a741c99394e81d1d86ffd066f3d9749875cBrian ctx->Extensions.ARB_texture_env_crossbar = GL_TRUE; 496c6499a741c99394e81d1d86ffd066f3d9749875cBrian ctx->Extensions.ARB_texture_env_dot3 = GL_TRUE; 497e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul ctx->Extensions.ARB_texture_storage = GL_TRUE; 4982a795ad5227f7b311c2b32afb77ba11068733283Brian Paul ctx->Extensions.ARB_vertex_program = GL_TRUE; 4992a0126932b320806e030c1c085791e257516e0cdMarek Olšák ctx->Extensions.ARB_vertex_shader = GL_TRUE; 500a0ae2ca033ec2024da1e01d1c11c0437837c031bMarek Olšák ctx->Extensions.ARB_window_pos = GL_TRUE; 501c6499a741c99394e81d1d86ffd066f3d9749875cBrian 502c6499a741c99394e81d1d86ffd066f3d9749875cBrian ctx->Extensions.EXT_blend_color = GL_TRUE; 503c6499a741c99394e81d1d86ffd066f3d9749875cBrian ctx->Extensions.EXT_blend_func_separate = GL_TRUE; 504c6499a741c99394e81d1d86ffd066f3d9749875cBrian ctx->Extensions.EXT_blend_minmax = GL_TRUE; 5050df877a0ee68359d106ba84e3dd3b7c42ae20d5aBrian ctx->Extensions.EXT_framebuffer_blit = GL_TRUE; 506c6499a741c99394e81d1d86ffd066f3d9749875cBrian ctx->Extensions.EXT_framebuffer_object = GL_TRUE; 507c6499a741c99394e81d1d86ffd066f3d9749875cBrian ctx->Extensions.EXT_fog_coord = GL_TRUE; 50850074ecd3a360d3479d789624a268847a644add8Marek Olšák ctx->Extensions.EXT_gpu_program_parameters = GL_TRUE; 509c6499a741c99394e81d1d86ffd066f3d9749875cBrian ctx->Extensions.EXT_pixel_buffer_object = GL_TRUE; 510c6499a741c99394e81d1d86ffd066f3d9749875cBrian ctx->Extensions.EXT_point_parameters = GL_TRUE; 511ded8eb25ef149cf7d2cde4169d36f528cf74d22dBrian Paul ctx->Extensions.EXT_provoking_vertex = GL_TRUE; 512c6499a741c99394e81d1d86ffd066f3d9749875cBrian ctx->Extensions.EXT_secondary_color = GL_TRUE; 5132a0126932b320806e030c1c085791e257516e0cdMarek Olšák ctx->Extensions.EXT_separate_shader_objects = GL_TRUE; 514c6499a741c99394e81d1d86ffd066f3d9749875cBrian ctx->Extensions.EXT_texture_env_dot3 = GL_TRUE; 5155b27b4ad37bd992d2d3a6fd9d407277113544f30Brian Paul ctx->Extensions.EXT_vertex_array_bgra = GL_TRUE; 516c6499a741c99394e81d1d86ffd066f3d9749875cBrian 51731a74a6df77daea9084c34b86f217f23a55e6b91Marek Olšák ctx->Extensions.ATI_texture_env_combine3 = GL_TRUE; 51831a74a6df77daea9084c34b86f217f23a55e6b91Marek Olšák 519a0ae2ca033ec2024da1e01d1c11c0437837c031bMarek Olšák ctx->Extensions.MESA_pack_invert = GL_TRUE; 520a0ae2ca033ec2024da1e01d1c11c0437837c031bMarek Olšák 521c6499a741c99394e81d1d86ffd066f3d9749875cBrian ctx->Extensions.NV_blend_square = GL_TRUE; 52264cebb6c8339f515ff8acb7c34fd0615b0e34a19Nicholas Miell ctx->Extensions.NV_fog_distance = GL_TRUE; 523c6499a741c99394e81d1d86ffd066f3d9749875cBrian ctx->Extensions.NV_texgen_reflection = GL_TRUE; 524d0b0df380ac6a9b421dc63531a180b3fd3017621Brian Paul ctx->Extensions.NV_texture_env_combine4 = GL_TRUE; 52540adcd611fe6939895c83e6ae945348437b3e7adMarek Olšák ctx->Extensions.NV_texture_rectangle = GL_TRUE; 526ed1c69710c5046a80a86a9e8b51a1cb15b1b92ebRoland Scheidegger#if 0 527ed1c69710c5046a80a86a9e8b51a1cb15b1b92ebRoland Scheidegger /* possibly could support the following two */ 528a0ae2ca033ec2024da1e01d1c11c0437837c031bMarek Olšák ctx->Extensions.NV_vertex_program = GL_TRUE; 529a0ae2ca033ec2024da1e01d1c11c0437837c031bMarek Olšák ctx->Extensions.NV_vertex_program1_1 = GL_TRUE; 530ed1c69710c5046a80a86a9e8b51a1cb15b1b92ebRoland Scheidegger#endif 531c6499a741c99394e81d1d86ffd066f3d9749875cBrian 5322002e4d06e2627241cd4af88f65b54d2101ef151Chia-I Wu#if FEATURE_OES_EGL_image 5332002e4d06e2627241cd4af88f65b54d2101ef151Chia-I Wu ctx->Extensions.OES_EGL_image = GL_TRUE; 5348cd0873d319cefce74164147c9855e81f051d1e1Chia-I Wu if (ctx->API != API_OPENGL) 5358cd0873d319cefce74164147c9855e81f051d1e1Chia-I Wu ctx->Extensions.OES_EGL_image_external = GL_TRUE; 5362002e4d06e2627241cd4af88f65b54d2101ef151Chia-I Wu#endif 53734064756a5e2c8952c9de26eaebafddabd562540Chia-I Wu#if FEATURE_OES_draw_texture 53834064756a5e2c8952c9de26eaebafddabd562540Chia-I Wu ctx->Extensions.OES_draw_texture = GL_TRUE; 53934064756a5e2c8952c9de26eaebafddabd562540Chia-I Wu#endif 54034064756a5e2c8952c9de26eaebafddabd562540Chia-I Wu 541c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák /* Expose the extensions which directly correspond to gallium caps. */ 542c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák for (i = 0; i < Elements(cap_mapping); i++) { 543c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák if (screen->get_param(screen, cap_mapping[i].cap)) { 544c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák extensions[cap_mapping[i].extension_offset] = GL_TRUE; 545c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák } 546c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák } 547c21d7b1e30edfc0e400836705645d188a0f538cdMarek Olšák 54841a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák /* Expose the extensions which directly correspond to gallium formats. */ 54941a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák init_format_extensions(st, rendertarget_mapping, 55041a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák Elements(rendertarget_mapping), PIPE_TEXTURE_2D, 55141a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW); 55241a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák init_format_extensions(st, depthstencil_mapping, 55341a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák Elements(depthstencil_mapping), PIPE_TEXTURE_2D, 55441a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_BIND_DEPTH_STENCIL | PIPE_BIND_SAMPLER_VIEW); 55541a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák init_format_extensions(st, texture_mapping, Elements(texture_mapping), 55641a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_TEXTURE_2D, PIPE_BIND_SAMPLER_VIEW); 55741a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák init_format_extensions(st, vertex_mapping, Elements(vertex_mapping), 55841a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák PIPE_BUFFER, PIPE_BIND_VERTEX_BUFFER); 55941a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák 560171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák /* Figure out GLSL support. */ 561171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák glsl_feature_level = screen->get_param(screen, PIPE_CAP_GLSL_FEATURE_LEVEL); 562171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák 563171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák if (glsl_feature_level >= 130) { 564171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák ctx->Const.GLSLVersion = 130; 565171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák } else { 566171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák ctx->Const.GLSLVersion = 120; 567171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák } 568171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák 569171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák _mesa_override_glsl_version(st->ctx); 570171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák 571171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák if (ctx->Const.GLSLVersion >= 130) { 572171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák ctx->Const.NativeIntegers = GL_TRUE; 573171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák ctx->Const.MaxClipPlanes = 8; 574171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák 575171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák /* Extensions that only depend on GLSL 1.3. */ 576171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák ctx->Extensions.ARB_conservative_depth = GL_TRUE; 577c445b0f76db5fd6cf7340bba9db09118c8639e0dMarek Olšák ctx->Extensions.ARB_shader_bit_encoding = GL_TRUE; 578171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák } else { 579171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák /* Optional integer support for GLSL 1.2. */ 580171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák if (screen->get_shader_param(screen, PIPE_SHADER_VERTEX, 581171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák PIPE_SHADER_CAP_INTEGERS) && 582171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, 583171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák PIPE_SHADER_CAP_INTEGERS)) { 584171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák ctx->Const.NativeIntegers = GL_TRUE; 585171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák } 586171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák } 587171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák 58841a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák /* Below are the cases which cannot be moved into tables easily. */ 589fdff7e635b91988f9c926a91f89f47bc24e81aa1Marek Olšák 59041a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák if (!ctx->Mesa_DXTn && !st_get_s3tc_override()) { 59141a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák ctx->Extensions.EXT_texture_compression_s3tc = GL_FALSE; 59241a4e274a4e78087ce8eafbabc3713ed75bb4759Marek Olšák ctx->Extensions.S3_s3tc = GL_FALSE; 593f154ac9cc251c9c5f527a09819a7fb9c5595267fDave Airlie } 594f154ac9cc251c9c5f527a09819a7fb9c5595267fDave Airlie 595d2633af696f2e4ff98f669061e4e222e8643312cMarek Olšák if (screen->get_shader_param(screen, PIPE_SHADER_GEOMETRY, 596d2633af696f2e4ff98f669061e4e222e8643312cMarek Olšák PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0) { 597bb7c2691d25b6aaea2663f85a5b6723edbf56938Brian Paul#if 0 /* XXX re-enable when GLSL compiler again supports geometry shaders */ 598da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ctx->Extensions.ARB_geometry_shader4 = GL_TRUE; 599bb7c2691d25b6aaea2663f85a5b6723edbf56938Brian Paul#endif 600da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 601c304869ec02793f2d8bf363d1e3b37c3d121cca7Marek Olšák 60272bd2b603bc400371a92d34ab59dbb2d2ef7a123Jakob Bornecrantz ctx->Extensions.NV_primitive_restart = GL_TRUE; 60372bd2b603bc400371a92d34ab59dbb2d2ef7a123Jakob Bornecrantz if (!screen->get_param(screen, PIPE_CAP_PRIMITIVE_RESTART)) { 604f16b39f05ce5aa2bcffff1bba01885d0061d9e63Jordan Justen ctx->Const.PrimitiveRestartInSoftware = GL_TRUE; 605053875a8b193481a7b1c209d9adf9d3d85788884Brian Paul } 606053875a8b193481a7b1c209d9adf9d3d85788884Brian Paul 607bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák if (screen->get_param(screen, PIPE_CAP_VERTEX_COLOR_UNCLAMPED)) { 60847e3896dfd89a26abbe4ca2469c2480f3982b204Luca Barbieri ctx->Extensions.ARB_color_buffer_float = GL_TRUE; 609bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák 610bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák if (!screen->get_param(screen, PIPE_CAP_VERTEX_COLOR_CLAMPED)) { 611bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák st->clamp_vert_color_in_shader = TRUE; 612bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák } 613bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák 614bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák if (!screen->get_param(screen, PIPE_CAP_FRAGMENT_COLOR_CLAMPED)) { 615bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák st->clamp_frag_color_in_shader = TRUE; 616bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák } 6178d4ec87d7f987b3852dafa6802815bb9a3ec7ad4Marek Olšák } 61847e3896dfd89a26abbe4ca2469c2480f3982b204Luca Barbieri 6195257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák if (screen->fence_finish) { 6205257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák ctx->Extensions.ARB_sync = GL_TRUE; 6215257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák } 622aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák 62357590e173b6f421b1015190aa3c0011ea55f31d8Christoph Bumiller /* Maximum sample count. */ 62457590e173b6f421b1015190aa3c0011ea55f31d8Christoph Bumiller for (i = 16; i > 0; --i) { 62557590e173b6f421b1015190aa3c0011ea55f31d8Christoph Bumiller if (screen->is_format_supported(screen, PIPE_FORMAT_B8G8R8A8_UNORM, 62657590e173b6f421b1015190aa3c0011ea55f31d8Christoph Bumiller PIPE_TEXTURE_2D, i, 62757590e173b6f421b1015190aa3c0011ea55f31d8Christoph Bumiller PIPE_BIND_RENDER_TARGET)) { 62857590e173b6f421b1015190aa3c0011ea55f31d8Christoph Bumiller ctx->Const.MaxSamples = i; 62957590e173b6f421b1015190aa3c0011ea55f31d8Christoph Bumiller break; 63057590e173b6f421b1015190aa3c0011ea55f31d8Christoph Bumiller } 63157590e173b6f421b1015190aa3c0011ea55f31d8Christoph Bumiller } 632d2d3cd2be78022e585b4a155d742d346471453d0Brian Paul if (ctx->Const.MaxSamples == 1) { 633d2d3cd2be78022e585b4a155d742d346471453d0Brian Paul /* one sample doesn't really make sense */ 634d2d3cd2be78022e585b4a155d742d346471453d0Brian Paul ctx->Const.MaxSamples = 0; 635d2d3cd2be78022e585b4a155d742d346471453d0Brian Paul } 636adcf0a0cf464fb27762ae04d599f50f778c32481Brian Paul else if (ctx->Const.MaxSamples >= 2) { 637adcf0a0cf464fb27762ae04d599f50f778c32481Brian Paul ctx->Extensions.EXT_framebuffer_multisample = GL_TRUE; 638adcf0a0cf464fb27762ae04d599f50f778c32481Brian Paul } 639a21df965075f6fa1bf27039490ad65b9f78548e6Dave Airlie 640a21df965075f6fa1bf27039490ad65b9f78548e6Dave Airlie if (ctx->Const.MaxDualSourceDrawBuffers > 0) 641a21df965075f6fa1bf27039490ad65b9f78548e6Dave Airlie ctx->Extensions.ARB_blend_func_extended = GL_TRUE; 64221f78d21898dd8aa74beb6aeeabda68f4c07ae1bMarek Olšák 64321f78d21898dd8aa74beb6aeeabda68f4c07ae1bMarek Olšák if (screen->get_param(screen, PIPE_CAP_TIMER_QUERY) && 64421f78d21898dd8aa74beb6aeeabda68f4c07ae1bMarek Olšák screen->get_param(screen, PIPE_CAP_QUERY_TIMESTAMP)) { 64521f78d21898dd8aa74beb6aeeabda68f4c07ae1bMarek Olšák ctx->Extensions.ARB_timer_query = GL_TRUE; 64621f78d21898dd8aa74beb6aeeabda68f4c07ae1bMarek Olšák } 64763d8c8baa99560c7a051b88afae645e60f07bc8fMarek Olšák 64863d8c8baa99560c7a051b88afae645e60f07bc8fMarek Olšák if (ctx->Extensions.ARB_transform_feedback2 && 64963d8c8baa99560c7a051b88afae645e60f07bc8fMarek Olšák ctx->Extensions.ARB_draw_instanced) { 65063d8c8baa99560c7a051b88afae645e60f07bc8fMarek Olšák ctx->Extensions.ARB_transform_feedback_instanced = GL_TRUE; 65163d8c8baa99560c7a051b88afae645e60f07bc8fMarek Olšák } 652a6457c0692f1bc292ae4120ff5cd0bed340271b9Vadim Girlin if (st->options.force_glsl_extensions_warn) 653a6457c0692f1bc292ae4120ff5cd0bed340271b9Vadim Girlin ctx->Const.ForceGLSLExtensionsWarn = 1; 654c6499a741c99394e81d1d86ffd066f3d9749875cBrian} 655