19f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt/* 29f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt Copyright (C) Intel Corp. 2006. All Rights Reserved. 39f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to 49f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt develop this 3D driver. 59f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 69f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt Permission is hereby granted, free of charge, to any person obtaining 79f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt a copy of this software and associated documentation files (the 89f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt "Software"), to deal in the Software without restriction, including 99f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt without limitation the rights to use, copy, modify, merge, publish, 109f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt distribute, sublicense, and/or sell copies of the Software, and to 119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt permit persons to whom the Software is furnished to do so, subject to 129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt the following conditions: 139f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 149f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt The above copyright notice and this permission notice (including the 159f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt next paragraph) shall be included in all copies or substantial 169f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt portions of the Software. 179f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 189f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 209f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 219f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 239f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 249f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 259f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 269f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt **********************************************************************/ 279f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* 289f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * Authors: 299f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * Keith Whitwell <keith@tungstengraphics.com> 309f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 319f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 329f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 33ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/imports.h" 344a6ad999ea312f0af85de621c8b6a15a3d3b7ffdBrian Paul#include "main/macros.h" 35c157cfc6376f7469ab272b18868183e5ff9ac754Eric Anholt#include "main/simple_list.h" 36b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace 37b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace#include "vbo/vbo_context.h" 38b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace 399f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "brw_context.h" 40a098fd71d7b7347bb8f1841bad0e7ce24e0e6de9Eric Anholt#include "brw_defines.h" 419f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "brw_draw.h" 4259b2c2adbbece27ccf54e58b598ea29cb3a5aa85Eric Anholt#include "brw_state.h" 43b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace 44b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace#include "intel_fbo.h" 45b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace#include "intel_mipmap_tree.h" 46b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace#include "intel_regions.h" 477381ccab449c65d843580f76426f87ab6b1649ceKristian Høgsberg#include "intel_span.h" 48b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace#include "intel_tex.h" 49b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace#include "intel_tex_obj.h" 50b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace 51dd1d66fc4ab5d7064113a2017a431c3461598b91Kristian Høgsberg#include "tnl/t_pipeline.h" 522f0edc60f4bd2ae5999a6afa656e3bb3f181bf0fChad Versace#include "glsl/ralloc.h" 539f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 549f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt/*************************************** 559f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * Mesa's Driver Functions 569f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt ***************************************/ 579f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 587f91c8bf2bf08afd297314c02a8869d8919f5f0eEric Anholtstatic void brwInitDriverFunctions(struct intel_screen *screen, 597f91c8bf2bf08afd297314c02a8869d8919f5f0eEric Anholt struct dd_function_table *functions) 609f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 619f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt intelInitDriverFunctions( functions ); 62dd1d66fc4ab5d7064113a2017a431c3461598b91Kristian Høgsberg 639f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt brwInitFragProgFuncs( functions ); 64c157cfc6376f7469ab272b18868183e5ff9ac754Eric Anholt brw_init_queryobj_functions(functions); 65b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace 6621504b462acda4977c5fdfffc192e73273b8fb26Kenneth Graunke functions->BeginTransformFeedback = brw_begin_transform_feedback; 677f91c8bf2bf08afd297314c02a8869d8919f5f0eEric Anholt 687f91c8bf2bf08afd297314c02a8869d8919f5f0eEric Anholt if (screen->gen >= 7) 697f91c8bf2bf08afd297314c02a8869d8919f5f0eEric Anholt functions->EndTransformFeedback = gen7_end_transform_feedback; 707f91c8bf2bf08afd297314c02a8869d8919f5f0eEric Anholt else 717f91c8bf2bf08afd297314c02a8869d8919f5f0eEric Anholt functions->EndTransformFeedback = brw_end_transform_feedback; 729f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 739f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 742e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkebool 752e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth GraunkebrwCreateContext(int api, 762e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke const struct gl_config *mesaVis, 772e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke __DRIcontext *driContextPriv, 78d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick unsigned major_version, 79d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick unsigned minor_version, 80bf8644e64daa4e1d59d1e399355b349406438d7aIan Romanick uint32_t flags, 81d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick unsigned *error, 822e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke void *sharedContextPrivate) 839f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 847f91c8bf2bf08afd297314c02a8869d8919f5f0eEric Anholt __DRIscreen *sPriv = driContextPriv->driScreenPriv; 857f91c8bf2bf08afd297314c02a8869d8919f5f0eEric Anholt struct intel_screen *screen = sPriv->driverPrivate; 869f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct dd_function_table functions; 878a3a76e1dac98244140b3e8d663719965c38be5fChad Versace const unsigned req_version = major_version * 10 + minor_version; 888a3a76e1dac98244140b3e8d663719965c38be5fChad Versace unsigned max_supported_version = 0; 896d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri unsigned i; 909f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 91d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick#ifdef TEXTURE_FLOAT_ENABLED 928a3a76e1dac98244140b3e8d663719965c38be5fChad Versace bool has_texture_float = true; 93d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick#else 948a3a76e1dac98244140b3e8d663719965c38be5fChad Versace bool has_texture_float = false; 95d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick#endif 96d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick 978a3a76e1dac98244140b3e8d663719965c38be5fChad Versace bool supports_gl30 = has_texture_float && 988a3a76e1dac98244140b3e8d663719965c38be5fChad Versace (screen->gen == 6 || 998a3a76e1dac98244140b3e8d663719965c38be5fChad Versace (screen->gen == 7 && 1008a3a76e1dac98244140b3e8d663719965c38be5fChad Versace screen->kernel_has_gen7_sol_reset)); 1018a3a76e1dac98244140b3e8d663719965c38be5fChad Versace 1028a3a76e1dac98244140b3e8d663719965c38be5fChad Versace /* Determine max_supported_version. */ 1038a3a76e1dac98244140b3e8d663719965c38be5fChad Versace switch (api) { 1048a3a76e1dac98244140b3e8d663719965c38be5fChad Versace case API_OPENGL: 1058a3a76e1dac98244140b3e8d663719965c38be5fChad Versace max_supported_version = supports_gl30 ? 30 : 21; 106d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick break; 107d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick case API_OPENGLES: 1088a3a76e1dac98244140b3e8d663719965c38be5fChad Versace max_supported_version = 11; 1098a3a76e1dac98244140b3e8d663719965c38be5fChad Versace break; 110d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick case API_OPENGLES2: 1118a3a76e1dac98244140b3e8d663719965c38be5fChad Versace max_supported_version = 20; 112d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick break; 1138a3a76e1dac98244140b3e8d663719965c38be5fChad Versace case API_OPENGL_CORE: 1148a3a76e1dac98244140b3e8d663719965c38be5fChad Versace max_supported_version = supports_gl30 ? 31 : 0; 1150e0d66446194ab0b2d114dc83e76ec9c9b1a01f1Ian Romanick break; 116d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick default: 1178a3a76e1dac98244140b3e8d663719965c38be5fChad Versace break; 1188a3a76e1dac98244140b3e8d663719965c38be5fChad Versace } 1198a3a76e1dac98244140b3e8d663719965c38be5fChad Versace 1208a3a76e1dac98244140b3e8d663719965c38be5fChad Versace if (max_supported_version == 0) { 121d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick *error = __DRI_CTX_ERROR_BAD_API; 122d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick return false; 1238a3a76e1dac98244140b3e8d663719965c38be5fChad Versace } else if (req_version > max_supported_version) { 1248a3a76e1dac98244140b3e8d663719965c38be5fChad Versace *error = __DRI_CTX_ERROR_BAD_VERSION; 1258a3a76e1dac98244140b3e8d663719965c38be5fChad Versace return false; 126d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick } 127d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick 128d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick struct brw_context *brw = rzalloc(NULL, struct brw_context); 1299f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt if (!brw) { 130298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("%s: failed to alloc context\n", __FUNCTION__); 131d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick *error = __DRI_CTX_ERROR_NO_MEMORY; 1322e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 1339f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 1349f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1358aaef12a599db583def7aa3558dfab98ce76f913Ian Romanick /* brwInitVtbl needs to know the chipset generation so that it can set the 1368aaef12a599db583def7aa3558dfab98ce76f913Ian Romanick * right pointers. 1378aaef12a599db583def7aa3558dfab98ce76f913Ian Romanick */ 1388aaef12a599db583def7aa3558dfab98ce76f913Ian Romanick brw->intel.gen = screen->gen; 1398aaef12a599db583def7aa3558dfab98ce76f913Ian Romanick 1408aaef12a599db583def7aa3558dfab98ce76f913Ian Romanick brwInitVtbl( brw ); 1418aaef12a599db583def7aa3558dfab98ce76f913Ian Romanick 1427f91c8bf2bf08afd297314c02a8869d8919f5f0eEric Anholt brwInitDriverFunctions(screen, &functions); 1439f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 144d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick struct intel_context *intel = &brw->intel; 145d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick struct gl_context *ctx = &intel->ctx; 146d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick 1474b69100bdcf26dbb5be4d600b7ca5f5cdf6e8f20Kristian Høgsberg if (!intelInitContext( intel, api, mesaVis, driContextPriv, 1489f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt sharedContextPrivate, &functions )) { 149298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("%s: failed to init intel context\n", __FUNCTION__); 150d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick *error = __DRI_CTX_ERROR_NO_MEMORY; 1512e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 1529f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 1539f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 154ca10b2d4494798405a5fd654201291944645af5dEric Anholt brw_init_surface_formats(brw); 155ca10b2d4494798405a5fd654201291944645af5dEric Anholt 1565b6ca237ee63fb85cff3bb942f5136f96f2c81ecXiang, Haihao /* Initialize swrast, tnl driver tables: */ 1575b6ca237ee63fb85cff3bb942f5136f96f2c81ecXiang, Haihao intelInitSpanFuncs(ctx); 1585b6ca237ee63fb85cff3bb942f5136f96f2c81ecXiang, Haihao 15967e9ae856355be532455c1cf1211d59b3a4c5992Eric Anholt TNLcontext *tnl = TNL_CONTEXT(ctx); 16067e9ae856355be532455c1cf1211d59b3a4c5992Eric Anholt if (tnl) 16167e9ae856355be532455c1cf1211d59b3a4c5992Eric Anholt tnl->Driver.RunPipeline = _tnl_run_pipeline; 162dd1d66fc4ab5d7064113a2017a431c3461598b91Kristian Høgsberg 16329362875f2613ad87abe7725ce3c56c36d16cf9bEric Anholt ctx->Const.MaxDualSourceDrawBuffers = 1; 164198ec96d364dabd82952a451eeda7937db383f0dBrian Paul ctx->Const.MaxDrawBuffers = BRW_MAX_DRAW_BUFFERS; 1659f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt ctx->Const.MaxTextureImageUnits = BRW_MAX_TEX_UNIT; 1664a6ad999ea312f0af85de621c8b6a15a3d3b7ffdBrian Paul ctx->Const.MaxTextureCoordUnits = 8; /* Mesa limit */ 1674a6ad999ea312f0af85de621c8b6a15a3d3b7ffdBrian Paul ctx->Const.MaxTextureUnits = MIN2(ctx->Const.MaxTextureCoordUnits, 1684a6ad999ea312f0af85de621c8b6a15a3d3b7ffdBrian Paul ctx->Const.MaxTextureImageUnits); 16937d24a70daa41bbad9c7a85dd432f561a172e858Kenneth Graunke ctx->Const.MaxVertexTextureImageUnits = BRW_MAX_TEX_UNIT; 17051e945ec9c0b803f5e998f87449fb02a7c39ae65Eric Anholt ctx->Const.MaxCombinedTextureImageUnits = 17151e945ec9c0b803f5e998f87449fb02a7c39ae65Eric Anholt ctx->Const.MaxVertexTextureImageUnits + 17251e945ec9c0b803f5e998f87449fb02a7c39ae65Eric Anholt ctx->Const.MaxTextureImageUnits; 1739f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 174f61d1deac7d19dcec38b7852a635d92680624a32Chris Wilson ctx->Const.MaxTextureLevels = 14; /* 8192 */ 175f61d1deac7d19dcec38b7852a635d92680624a32Chris Wilson if (ctx->Const.MaxTextureLevels > MAX_TEXTURE_LEVELS) 176f61d1deac7d19dcec38b7852a635d92680624a32Chris Wilson ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS; 1779f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt ctx->Const.Max3DTextureLevels = 9; 1789f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt ctx->Const.MaxCubeTextureLevels = 12; 1793d4efc583ce46e6f0a13302679fe1349d521a4a3Eric Anholt 1803d4efc583ce46e6f0a13302679fe1349d521a4a3Eric Anholt if (intel->gen >= 7) 1813d4efc583ce46e6f0a13302679fe1349d521a4a3Eric Anholt ctx->Const.MaxArrayTextureLayers = 2048; 1823d4efc583ce46e6f0a13302679fe1349d521a4a3Eric Anholt else 1833d4efc583ce46e6f0a13302679fe1349d521a4a3Eric Anholt ctx->Const.MaxArrayTextureLayers = 512; 1843d4efc583ce46e6f0a13302679fe1349d521a4a3Eric Anholt 185954dfba12986f578f2d8461818f9e9ac1f8f2b41Keith Packard ctx->Const.MaxTextureRectSize = (1<<12); 1869f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 18750853be894aa3edd1e9271f7d625f319209e340fRoland Scheidegger ctx->Const.MaxTextureMaxAnisotropy = 16.0; 18850853be894aa3edd1e9271f7d625f319209e340fRoland Scheidegger 1899308f298300beaa757194a0db8ed50924754c011Paul Berry /* Hardware only supports a limited number of transform feedback buffers. 1909308f298300beaa757194a0db8ed50924754c011Paul Berry * So we need to override the Mesa default (which is based only on software 1919308f298300beaa757194a0db8ed50924754c011Paul Berry * limits). 1929308f298300beaa757194a0db8ed50924754c011Paul Berry */ 19315ac66e331abdab12e882d80a6b4f647bc905298Marek Olšák ctx->Const.MaxTransformFeedbackBuffers = BRW_MAX_SOL_BUFFERS; 1949308f298300beaa757194a0db8ed50924754c011Paul Berry 1959308f298300beaa757194a0db8ed50924754c011Paul Berry /* On Gen6, in the worst case, we use up one binding table entry per 1969308f298300beaa757194a0db8ed50924754c011Paul Berry * transform feedback component (see comments above the definition of 1979308f298300beaa757194a0db8ed50924754c011Paul Berry * BRW_MAX_SOL_BINDINGS, in brw_context.h), so we need to advertise a value 1989308f298300beaa757194a0db8ed50924754c011Paul Berry * for MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS equal to 1999308f298300beaa757194a0db8ed50924754c011Paul Berry * BRW_MAX_SOL_BINDINGS. 2009308f298300beaa757194a0db8ed50924754c011Paul Berry * 2019308f298300beaa757194a0db8ed50924754c011Paul Berry * In "separate components" mode, we need to divide this value by 2029308f298300beaa757194a0db8ed50924754c011Paul Berry * BRW_MAX_SOL_BUFFERS, so that the total number of binding table entries 2039308f298300beaa757194a0db8ed50924754c011Paul Berry * used up by all buffers will not exceed BRW_MAX_SOL_BINDINGS. 2049308f298300beaa757194a0db8ed50924754c011Paul Berry */ 2059308f298300beaa757194a0db8ed50924754c011Paul Berry ctx->Const.MaxTransformFeedbackInterleavedComponents = BRW_MAX_SOL_BINDINGS; 2069308f298300beaa757194a0db8ed50924754c011Paul Berry ctx->Const.MaxTransformFeedbackSeparateComponents = 2079308f298300beaa757194a0db8ed50924754c011Paul Berry BRW_MAX_SOL_BINDINGS / BRW_MAX_SOL_BUFFERS; 2089308f298300beaa757194a0db8ed50924754c011Paul Berry 209497bf5dd2b36c7d0c8ae23d2bf039c91b97140fcPaul Berry if (intel->gen == 6) 210be4e46b21a60cfdc826bf89d1078df54966115b1Eric Anholt ctx->Const.MaxSamples = 4; 211497bf5dd2b36c7d0c8ae23d2bf039c91b97140fcPaul Berry else if (intel->gen >= 7) 212497bf5dd2b36c7d0c8ae23d2bf039c91b97140fcPaul Berry ctx->Const.MaxSamples = 8; 213be4e46b21a60cfdc826bf89d1078df54966115b1Eric Anholt 21449b53407c7c4f08b5e13591fd04080ca602fba40Brian Paul /* if conformance mode is set, swrast can handle any size AA point */ 21549b53407c7c4f08b5e13591fd04080ca602fba40Brian Paul ctx->Const.MaxPointSizeAA = 255.0; 21649b53407c7c4f08b5e13591fd04080ca602fba40Brian Paul 217a9e753c84cc5acc2a89686a5e4109f3b056d4fb4Brian Paul /* We want the GLSL compiler to emit code that uses condition codes */ 2186d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri for (i = 0; i <= MESA_SHADER_FRAGMENT; i++) { 21901f9fdc4acd28cc4630a3c71f2d007373f4d979cKenneth Graunke ctx->ShaderCompilerOptions[i].MaxIfDepth = intel->gen < 6 ? 16 : UINT_MAX; 2202e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke ctx->ShaderCompilerOptions[i].EmitCondCodes = true; 2212e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke ctx->ShaderCompilerOptions[i].EmitNVTempInitialization = true; 2222e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke ctx->ShaderCompilerOptions[i].EmitNoNoise = true; 2232e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke ctx->ShaderCompilerOptions[i].EmitNoMainReturn = true; 2242e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke ctx->ShaderCompilerOptions[i].EmitNoIndirectInput = true; 2252e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke ctx->ShaderCompilerOptions[i].EmitNoIndirectOutput = true; 226a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick 227a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick ctx->ShaderCompilerOptions[i].EmitNoIndirectUniform = 228a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick (i == MESA_SHADER_FRAGMENT); 229a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick ctx->ShaderCompilerOptions[i].EmitNoIndirectTemp = 230a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick (i == MESA_SHADER_FRAGMENT); 2312e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke ctx->ShaderCompilerOptions[i].LowerClipDistance = true; 2326d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri } 233a9e753c84cc5acc2a89686a5e4109f3b056d4fb4Brian Paul 234eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.VertexProgram.MaxNativeInstructions = (16 * 1024); 235eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.VertexProgram.MaxAluInstructions = 0; 236eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.VertexProgram.MaxTexInstructions = 0; 237eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.VertexProgram.MaxTexIndirections = 0; 238eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.VertexProgram.MaxNativeAluInstructions = 0; 239eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.VertexProgram.MaxNativeTexInstructions = 0; 240eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.VertexProgram.MaxNativeTexIndirections = 0; 241eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.VertexProgram.MaxNativeAttribs = 16; 242eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.VertexProgram.MaxNativeTemps = 256; 243eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.VertexProgram.MaxNativeAddressRegs = 1; 24409c73c74376ed6b12e343c89b4eac94285439860Ian Romanick ctx->Const.VertexProgram.MaxNativeParameters = 1024; 245eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.VertexProgram.MaxEnvParams = 246eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick MIN2(ctx->Const.VertexProgram.MaxNativeParameters, 247eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.VertexProgram.MaxEnvParams); 248eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick 249eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.FragmentProgram.MaxNativeInstructions = (16 * 1024); 250eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.FragmentProgram.MaxNativeAluInstructions = (16 * 1024); 251eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.FragmentProgram.MaxNativeTexInstructions = (16 * 1024); 252eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.FragmentProgram.MaxNativeTexIndirections = (16 * 1024); 253eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.FragmentProgram.MaxNativeAttribs = 12; 254eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.FragmentProgram.MaxNativeTemps = 256; 255eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.FragmentProgram.MaxNativeAddressRegs = 0; 25609c73c74376ed6b12e343c89b4eac94285439860Ian Romanick ctx->Const.FragmentProgram.MaxNativeParameters = 1024; 257eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.FragmentProgram.MaxEnvParams = 258eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick MIN2(ctx->Const.FragmentProgram.MaxNativeParameters, 259eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick ctx->Const.FragmentProgram.MaxEnvParams); 2609f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 2613d028024e581b05f71f0be915657c2c105885de6Ian Romanick /* Fragment shaders use real, 32-bit twos-complement integers for all 2623d028024e581b05f71f0be915657c2c105885de6Ian Romanick * integer types. 2633d028024e581b05f71f0be915657c2c105885de6Ian Romanick */ 2642fb0aebd4a248d2a0725099cd5646253c30c1dc3Ian Romanick ctx->Const.FragmentProgram.LowInt.RangeMin = 31; 2652fb0aebd4a248d2a0725099cd5646253c30c1dc3Ian Romanick ctx->Const.FragmentProgram.LowInt.RangeMax = 30; 2662fb0aebd4a248d2a0725099cd5646253c30c1dc3Ian Romanick ctx->Const.FragmentProgram.LowInt.Precision = 0; 2672fb0aebd4a248d2a0725099cd5646253c30c1dc3Ian Romanick ctx->Const.FragmentProgram.HighInt = ctx->Const.FragmentProgram.MediumInt 2682fb0aebd4a248d2a0725099cd5646253c30c1dc3Ian Romanick = ctx->Const.FragmentProgram.LowInt; 2693d028024e581b05f71f0be915657c2c105885de6Ian Romanick 270bea6539abff17f39c822ac9c1c94f8249c396b18Zhenyu Wang /* Gen6 converts quads to polygon in beginning of 3D pipeline, 271bea6539abff17f39c822ac9c1c94f8249c396b18Zhenyu Wang but we're not sure how it's actually done for vertex order, 272bea6539abff17f39c822ac9c1c94f8249c396b18Zhenyu Wang that affect provoking vertex decision. Always use last vertex 273bea6539abff17f39c822ac9c1c94f8249c396b18Zhenyu Wang convention for quad primitive which works as expected for now. */ 274fa4b23581b4ee8a07400364dccbd61b749c2d1d1Kenneth Graunke if (intel->gen >= 6) 2752e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke ctx->Const.QuadsFollowProvokingVertexConvention = false; 276bea6539abff17f39c822ac9c1c94f8249c396b18Zhenyu Wang 277f0159018d7709b57d9916575512d75cb3f2fb395Eric Anholt ctx->Const.QueryCounterBits.Timestamp = 36; 278f0159018d7709b57d9916575512d75cb3f2fb395Eric Anholt 279cdcef6cbf4dd80047819e9098e34a3b98bd502a4Zhenyu Wang if (intel->is_g4x || intel->gen >= 5) { 280348bdaa529c3eb60fcf03ed4531193bbf2e12491Kenneth Graunke brw->CMD_VF_STATISTICS = GM45_3DSTATE_VF_STATISTICS; 2810b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt brw->CMD_PIPELINE_SELECT = CMD_PIPELINE_SELECT_GM45; 2822e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke brw->has_surface_tile_offset = true; 283da1502494b63fcd65bc60f50e59241164481f8b3Zhenyu Wang if (intel->gen < 6) 2842e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke brw->has_compr4 = true; 2852e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke brw->has_aa_line_parameters = true; 2862e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke brw->has_pln = true; 2870b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt } else { 288348bdaa529c3eb60fcf03ed4531193bbf2e12491Kenneth Graunke brw->CMD_VF_STATISTICS = GEN4_3DSTATE_VF_STATISTICS; 2890b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt brw->CMD_PIPELINE_SELECT = CMD_PIPELINE_SELECT_965; 2900b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt } 2910b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt 2920b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt /* WM maximum threads is number of EUs times number of threads per EU. */ 293871da78263673cf123e28b3c0aa88b48745ac93dKenneth Graunke assert(intel->gen <= 7); 294871da78263673cf123e28b3c0aa88b48745ac93dKenneth Graunke 295871da78263673cf123e28b3c0aa88b48745ac93dKenneth Graunke if (intel->is_haswell) { 296871da78263673cf123e28b3c0aa88b48745ac93dKenneth Graunke if (intel->gt == 1) { 297871da78263673cf123e28b3c0aa88b48745ac93dKenneth Graunke brw->max_wm_threads = 102; 298871da78263673cf123e28b3c0aa88b48745ac93dKenneth Graunke brw->max_vs_threads = 70; 299871da78263673cf123e28b3c0aa88b48745ac93dKenneth Graunke brw->urb.size = 128; 300871da78263673cf123e28b3c0aa88b48745ac93dKenneth Graunke brw->urb.max_vs_entries = 640; 301871da78263673cf123e28b3c0aa88b48745ac93dKenneth Graunke brw->urb.max_gs_entries = 256; 302871da78263673cf123e28b3c0aa88b48745ac93dKenneth Graunke } else if (intel->gt == 2) { 303871da78263673cf123e28b3c0aa88b48745ac93dKenneth Graunke brw->max_wm_threads = 204; 304871da78263673cf123e28b3c0aa88b48745ac93dKenneth Graunke brw->max_vs_threads = 280; 305871da78263673cf123e28b3c0aa88b48745ac93dKenneth Graunke brw->urb.size = 256; 306871da78263673cf123e28b3c0aa88b48745ac93dKenneth Graunke brw->urb.max_vs_entries = 1664; 307871da78263673cf123e28b3c0aa88b48745ac93dKenneth Graunke brw->urb.max_gs_entries = 640; 308871da78263673cf123e28b3c0aa88b48745ac93dKenneth Graunke } 309871da78263673cf123e28b3c0aa88b48745ac93dKenneth Graunke } else if (intel->gen == 7) { 310490e6470a09c3a6049e5e859d72b0b679ef5d070Kenneth Graunke if (intel->gt == 1) { 311fbf86c7f0f1f12e52b927e3870535073879d0a4dEric Anholt brw->max_wm_threads = 48; 312db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke brw->max_vs_threads = 36; 313f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke brw->max_gs_threads = 36; 3148832920c298f4e13ffd5e53feeba509be69edb16Kenneth Graunke brw->urb.size = 128; 3158832920c298f4e13ffd5e53feeba509be69edb16Kenneth Graunke brw->urb.max_vs_entries = 512; 3168832920c298f4e13ffd5e53feeba509be69edb16Kenneth Graunke brw->urb.max_gs_entries = 192; 317490e6470a09c3a6049e5e859d72b0b679ef5d070Kenneth Graunke } else if (intel->gt == 2) { 318b2a44cde6468fb6065169194fe3a67b2f4738b71Eric Anholt brw->max_wm_threads = 172; 319db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke brw->max_vs_threads = 128; 320f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke brw->max_gs_threads = 128; 3218832920c298f4e13ffd5e53feeba509be69edb16Kenneth Graunke brw->urb.size = 256; 3228832920c298f4e13ffd5e53feeba509be69edb16Kenneth Graunke brw->urb.max_vs_entries = 704; 3238832920c298f4e13ffd5e53feeba509be69edb16Kenneth Graunke brw->urb.max_gs_entries = 320; 324477e2fe0318c79978dedd51a5a6039cf05fc59fbKenneth Graunke } else { 325477e2fe0318c79978dedd51a5a6039cf05fc59fbKenneth Graunke assert(!"Unknown gen7 device."); 326477e2fe0318c79978dedd51a5a6039cf05fc59fbKenneth Graunke } 327477e2fe0318c79978dedd51a5a6039cf05fc59fbKenneth Graunke } else if (intel->gen == 6) { 328490e6470a09c3a6049e5e859d72b0b679ef5d070Kenneth Graunke if (intel->gt == 2) { 329588881430a3d328f2d99fbd5197d85dafc31209bZou Nan hai brw->max_wm_threads = 80; 330db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke brw->max_vs_threads = 60; 331f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke brw->max_gs_threads = 60; 33242a805700039e81a9245f46f153e2cd9705cd0d7Kenneth Graunke brw->urb.size = 64; /* volume 5c.5 section 5.1 */ 333ef59049c5242a1be7fa59a182d342191185dd62bEric Anholt brw->urb.max_vs_entries = 256; /* volume 2a (see 3DSTATE_URB) */ 3347a63a311e56fd492823b4b44e526df5a8dc0a021Kenneth Graunke brw->urb.max_gs_entries = 256; 335904b8ba1bb604b2eaaa22f7f074d236011fe213fEric Anholt } else { 336db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke brw->max_wm_threads = 40; 337db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke brw->max_vs_threads = 24; 338f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke brw->max_gs_threads = 21; /* conservative; 24 if rendering disabled */ 33942a805700039e81a9245f46f153e2cd9705cd0d7Kenneth Graunke brw->urb.size = 32; /* volume 5c.5 section 5.1 */ 340dc435ae774b1deed3d00b7c7d33133c08b626737Paul Berry brw->urb.max_vs_entries = 256; /* volume 2a (see 3DSTATE_URB) */ 3417a63a311e56fd492823b4b44e526df5a8dc0a021Kenneth Graunke brw->urb.max_gs_entries = 256; 342904b8ba1bb604b2eaaa22f7f074d236011fe213fEric Anholt } 34343e39b58c705714c01919e5b4b5566e82e803d58Paul Berry brw->urb.gen6_gs_previously_active = false; 34435c127362f7b0c186923934f34148de319093cbfZhenyu Wang } else if (intel->gen == 5) { 3450b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt brw->urb.size = 1024; 346db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke brw->max_vs_threads = 72; 347f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke brw->max_gs_threads = 32; 348db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke brw->max_wm_threads = 12 * 6; 3490b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt } else if (intel->is_g4x) { 3500b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt brw->urb.size = 384; 351db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke brw->max_vs_threads = 32; 352f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke brw->max_gs_threads = 2; 353db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke brw->max_wm_threads = 10 * 5; 35489cce536cbc55460bc534acc06ea9f4d9ae71016Eric Anholt } else if (intel->gen < 6) { 3550b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt brw->urb.size = 256; 356db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke brw->max_vs_threads = 16; 357f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke brw->max_gs_threads = 2; 358db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke brw->max_wm_threads = 8 * 4; 3592e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke brw->has_negative_rhw_bug = true; 3600b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt } 3610b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt 3628313f44409ceb733e9f8835926364164237b3111Paul Berry if (intel->gen <= 7) { 3638313f44409ceb733e9f8835926364164237b3111Paul Berry brw->needs_unlit_centroid_workaround = true; 3648313f44409ceb733e9f8835926364164237b3111Paul Berry } 3658313f44409ceb733e9f8835926364164237b3111Paul Berry 366df7d1323de08274c816a8e5fab7e99b6f00f4fa3Jordan Justen brw->prim_restart.in_progress = false; 367f9389fbfb204995a650047949c48ab2b2703bfcfJordan Justen brw->prim_restart.enable_cut_index = false; 368860d5bdf984730f69cd19b4f7145f3c84b57d33dKenneth Graunke intel->hw_ctx = drm_intel_gem_context_create(intel->bufmgr); 369df7d1323de08274c816a8e5fab7e99b6f00f4fa3Jordan Justen 3709f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt brw_init_state( brw ); 3719f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 372503eb57a003f51c25687e9cf0ad6f7939a757f1bEric Anholt brw->curbe.last_buf = calloc(1, 4096); 373503eb57a003f51c25687e9cf0ad6f7939a757f1bEric Anholt brw->curbe.next_buf = calloc(1, 4096); 374503eb57a003f51c25687e9cf0ad6f7939a757f1bEric Anholt 3759f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt brw->state.dirty.mesa = ~0; 3769f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt brw->state.dirty.brw = ~0; 3779f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 3789f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt brw->emit_state_always = 0; 3799f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 3800ab7d6f437f2f7a1b2d84f30497f3c2013b52791Eric Anholt intel->batch.need_workaround_flush = true; 3810ab7d6f437f2f7a1b2d84f30497f3c2013b52791Eric Anholt 3822e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke ctx->VertexProgram._MaintainTnlProgram = true; 3832e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke ctx->FragmentProgram._MaintainTexEnvProgram = true; 3849f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 3859f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt brw_draw_init( brw ); 3869f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 387c6abde211fa875f90e59e3709720cfe394669069Eric Anholt brw->precompile = driQueryOptionb(&intel->optionCache, "shader_precompile"); 3882f82c33deefba61b3e72edb4375850c0629af224Eric Anholt 389bdedd03b701781c8b71e162f7eb834e6a11105deKenneth Graunke ctx->Const.NativeIntegers = true; 390bdedd03b701781c8b71e162f7eb834e6a11105deKenneth Graunke ctx->Const.UniformBooleanTrue = 1; 39155b7fbb70ffc1f4def5c3ded63c3ef569e693731Eric Anholt 392642247883fb9e6dce9bad724f7f6503321e0ef6fEric Anholt ctx->Const.ForceGLSLExtensionsWarn = driQueryOptionb(&intel->optionCache, "force_glsl_extensions_warn"); 393642247883fb9e6dce9bad724f7f6503321e0ef6fEric Anholt 394bf8644e64daa4e1d59d1e399355b349406438d7aIan Romanick ctx->Const.ContextFlags = 0; 395bf8644e64daa4e1d59d1e399355b349406438d7aIan Romanick if ((flags & __DRI_CTX_FLAG_FORWARD_COMPATIBLE) != 0) 396bf8644e64daa4e1d59d1e399355b349406438d7aIan Romanick ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT; 397bf8644e64daa4e1d59d1e399355b349406438d7aIan Romanick 398bf8644e64daa4e1d59d1e399355b349406438d7aIan Romanick if ((flags & __DRI_CTX_FLAG_DEBUG) != 0) 399bf8644e64daa4e1d59d1e399355b349406438d7aIan Romanick ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_DEBUG_BIT; 400bf8644e64daa4e1d59d1e399355b349406438d7aIan Romanick 4012e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return true; 4029f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 4039f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 404