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