brw_context.c revision 21504b462acda4977c5fdfffc192e73273b8fb26
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 "gen6_hiz.h"
45b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace
46b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace#include "intel_fbo.h"
47b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace#include "intel_mipmap_tree.h"
48b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace#include "intel_regions.h"
497381ccab449c65d843580f76426f87ab6b1649ceKristian Høgsberg#include "intel_span.h"
50b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace#include "intel_tex.h"
51b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace#include "intel_tex_obj.h"
52b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace
53dd1d66fc4ab5d7064113a2017a431c3461598b91Kristian Høgsberg#include "tnl/t_pipeline.h"
542f0edc60f4bd2ae5999a6afa656e3bb3f181bf0fChad Versace#include "glsl/ralloc.h"
559f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
569f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt/***************************************
579f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * Mesa's Driver Functions
589f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt ***************************************/
599f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
60b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace/**
61b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace * \brief Prepare for entry into glBegin/glEnd block.
62b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace *
63b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace * Resolve buffers before entering a glBegin/glEnd block. This is
64b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace * necessary to prevent recursive calls to FLUSH_VERTICES.
65b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace *
66b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace * This resolves the depth buffer of each enabled depth texture and the HiZ
67b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace * buffer of the attached depth renderbuffer.
68b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace *
69b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace * Details
70b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace * -------
71b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace * When vertices are queued during a glBegin/glEnd block, those vertices must
72b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace * be drawn before any rendering state changes. To ensure this, Mesa calls
73b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace * FLUSH_VERTICES as a prehook to such state changes. Therefore,
74b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace * FLUSH_VERTICES itself cannot change rendering state without falling into a
75b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace * recursive trap.
76b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace *
77b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace * This precludes meta-ops, namely buffer resolves, from occurring while any
78b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace * vertices are queued. To prevent that situation, we resolve some buffers on
79b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace * entering a glBegin/glEnd
80b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace *
81b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace * \see brwCleanupExecEnd()
82b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace */
83b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versacestatic void brwPrepareExecBegin(struct gl_context *ctx)
84b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace{
85b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace   struct brw_context *brw = brw_context(ctx);
86b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace   struct intel_context *intel = &brw->intel;
87b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace   struct intel_renderbuffer *draw_irb;
88b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace   struct intel_texture_object *tex_obj;
89b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace
90b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace   if (!intel->has_hiz) {
91b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace      /* The context uses no feature that requires buffer resolves. */
92b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace      return;
93b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace   }
94b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace
95b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace   /* Resolve each enabled texture. */
96b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace   for (int i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
97b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace      if (!ctx->Texture.Unit[i]._ReallyEnabled)
98b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace	 continue;
99b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace      tex_obj = intel_texture_object(ctx->Texture.Unit[i]._Current);
100b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace      if (!tex_obj || !tex_obj->mt)
101b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace	 continue;
102b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace      intel_miptree_all_slices_resolve_depth(intel, tex_obj->mt);
103b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace   }
104b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace
105b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace   /* Resolve the attached depth buffer. */
106b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace   draw_irb = intel_get_renderbuffer(ctx->DrawBuffer, BUFFER_DEPTH);
107b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace   if (draw_irb) {
108b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace      intel_renderbuffer_resolve_hiz(intel, draw_irb);
109b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace   }
110b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace}
111b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace
1129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic void brwInitDriverFunctions( struct dd_function_table *functions )
1139f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{
1149f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   intelInitDriverFunctions( functions );
115dd1d66fc4ab5d7064113a2017a431c3461598b91Kristian Høgsberg
1169f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brwInitFragProgFuncs( functions );
117c157cfc6376f7469ab272b18868183e5ff9ac754Eric Anholt   brw_init_queryobj_functions(functions);
118b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace
119b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace   functions->PrepareExecBegin = brwPrepareExecBegin;
12021504b462acda4977c5fdfffc192e73273b8fb26Kenneth Graunke   functions->BeginTransformFeedback = brw_begin_transform_feedback;
12163cf7fad13fc9cfdd2ae7b031426f79107000300Paul Berry   functions->EndTransformFeedback = brw_end_transform_feedback;
1229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt}
1239f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1242e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkebool
1252e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth GraunkebrwCreateContext(int api,
1262e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke	         const struct gl_config *mesaVis,
1272e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke		 __DRIcontext *driContextPriv,
1282e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke	         void *sharedContextPrivate)
1299f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{
1309f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   struct dd_function_table functions;
13135d5d5df72a2747262e00e521e650c8974d6c64dEric Anholt   struct brw_context *brw = rzalloc(NULL, struct brw_context);
1329f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   struct intel_context *intel = &brw->intel;
133f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg   struct gl_context *ctx = &intel->ctx;
1346d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri   unsigned i;
1359f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1369f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   if (!brw) {
137298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("%s: failed to alloc context\n", __FUNCTION__);
1382e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
1399f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   }
1409f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1419f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brwInitDriverFunctions( &functions );
1429f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1434b69100bdcf26dbb5be4d600b7ca5f5cdf6e8f20Kristian Høgsberg   if (!intelInitContext( intel, api, mesaVis, driContextPriv,
1449f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt			  sharedContextPrivate, &functions )) {
145298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("%s: failed to init intel context\n", __FUNCTION__);
1469f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      FREE(brw);
1472e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
1489f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   }
1499f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
150b393fa91676aba0883d8f5260bd2910777aceb11Chad Versace   brwInitVtbl( brw );
151b393fa91676aba0883d8f5260bd2910777aceb11Chad Versace
152ca10b2d4494798405a5fd654201291944645af5dEric Anholt   brw_init_surface_formats(brw);
153ca10b2d4494798405a5fd654201291944645af5dEric Anholt
1545b6ca237ee63fb85cff3bb942f5136f96f2c81ecXiang, Haihao   /* Initialize swrast, tnl driver tables: */
1555b6ca237ee63fb85cff3bb942f5136f96f2c81ecXiang, Haihao   intelInitSpanFuncs(ctx);
1565b6ca237ee63fb85cff3bb942f5136f96f2c81ecXiang, Haihao
157dd1d66fc4ab5d7064113a2017a431c3461598b91Kristian Høgsberg   TNL_CONTEXT(ctx)->Driver.RunPipeline = _tnl_run_pipeline;
158dd1d66fc4ab5d7064113a2017a431c3461598b91Kristian Høgsberg
159198ec96d364dabd82952a451eeda7937db383f0dBrian Paul   ctx->Const.MaxDrawBuffers = BRW_MAX_DRAW_BUFFERS;
1609f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   ctx->Const.MaxTextureImageUnits = BRW_MAX_TEX_UNIT;
1614a6ad999ea312f0af85de621c8b6a15a3d3b7ffdBrian Paul   ctx->Const.MaxTextureCoordUnits = 8; /* Mesa limit */
1624a6ad999ea312f0af85de621c8b6a15a3d3b7ffdBrian Paul   ctx->Const.MaxTextureUnits = MIN2(ctx->Const.MaxTextureCoordUnits,
1634a6ad999ea312f0af85de621c8b6a15a3d3b7ffdBrian Paul                                     ctx->Const.MaxTextureImageUnits);
16437d24a70daa41bbad9c7a85dd432f561a172e858Kenneth Graunke   ctx->Const.MaxVertexTextureImageUnits = BRW_MAX_TEX_UNIT;
16551e945ec9c0b803f5e998f87449fb02a7c39ae65Eric Anholt   ctx->Const.MaxCombinedTextureImageUnits =
16651e945ec9c0b803f5e998f87449fb02a7c39ae65Eric Anholt      ctx->Const.MaxVertexTextureImageUnits +
16751e945ec9c0b803f5e998f87449fb02a7c39ae65Eric Anholt      ctx->Const.MaxTextureImageUnits;
1689f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
169f61d1deac7d19dcec38b7852a635d92680624a32Chris Wilson   ctx->Const.MaxTextureLevels = 14; /* 8192 */
170f61d1deac7d19dcec38b7852a635d92680624a32Chris Wilson   if (ctx->Const.MaxTextureLevels > MAX_TEXTURE_LEVELS)
171f61d1deac7d19dcec38b7852a635d92680624a32Chris Wilson	   ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
1729f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   ctx->Const.Max3DTextureLevels = 9;
1739f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   ctx->Const.MaxCubeTextureLevels = 12;
174669f1822d2a60865514faf37f9fde21e4567b3d2Eric Anholt   /* minimum maximum.  Users are likely to run into memory problems
175669f1822d2a60865514faf37f9fde21e4567b3d2Eric Anholt    * even at this size, since 64 * 2048 * 2048 * 4 = 1GB and we can't
176669f1822d2a60865514faf37f9fde21e4567b3d2Eric Anholt    * address that much.
177669f1822d2a60865514faf37f9fde21e4567b3d2Eric Anholt    */
178669f1822d2a60865514faf37f9fde21e4567b3d2Eric Anholt   ctx->Const.MaxArrayTextureLayers = 64;
179954dfba12986f578f2d8461818f9e9ac1f8f2b41Keith Packard   ctx->Const.MaxTextureRectSize = (1<<12);
1809f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
18150853be894aa3edd1e9271f7d625f319209e340fRoland Scheidegger   ctx->Const.MaxTextureMaxAnisotropy = 16.0;
18250853be894aa3edd1e9271f7d625f319209e340fRoland Scheidegger
1839308f298300beaa757194a0db8ed50924754c011Paul Berry   /* Hardware only supports a limited number of transform feedback buffers.
1849308f298300beaa757194a0db8ed50924754c011Paul Berry    * So we need to override the Mesa default (which is based only on software
1859308f298300beaa757194a0db8ed50924754c011Paul Berry    * limits).
1869308f298300beaa757194a0db8ed50924754c011Paul Berry    */
1879308f298300beaa757194a0db8ed50924754c011Paul Berry   ctx->Const.MaxTransformFeedbackSeparateAttribs = BRW_MAX_SOL_BUFFERS;
1889308f298300beaa757194a0db8ed50924754c011Paul Berry
1899308f298300beaa757194a0db8ed50924754c011Paul Berry   /* On Gen6, in the worst case, we use up one binding table entry per
1909308f298300beaa757194a0db8ed50924754c011Paul Berry    * transform feedback component (see comments above the definition of
1919308f298300beaa757194a0db8ed50924754c011Paul Berry    * BRW_MAX_SOL_BINDINGS, in brw_context.h), so we need to advertise a value
1929308f298300beaa757194a0db8ed50924754c011Paul Berry    * for MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS equal to
1939308f298300beaa757194a0db8ed50924754c011Paul Berry    * BRW_MAX_SOL_BINDINGS.
1949308f298300beaa757194a0db8ed50924754c011Paul Berry    *
1959308f298300beaa757194a0db8ed50924754c011Paul Berry    * In "separate components" mode, we need to divide this value by
1969308f298300beaa757194a0db8ed50924754c011Paul Berry    * BRW_MAX_SOL_BUFFERS, so that the total number of binding table entries
1979308f298300beaa757194a0db8ed50924754c011Paul Berry    * used up by all buffers will not exceed BRW_MAX_SOL_BINDINGS.
1989308f298300beaa757194a0db8ed50924754c011Paul Berry    */
1999308f298300beaa757194a0db8ed50924754c011Paul Berry   ctx->Const.MaxTransformFeedbackInterleavedComponents = BRW_MAX_SOL_BINDINGS;
2009308f298300beaa757194a0db8ed50924754c011Paul Berry   ctx->Const.MaxTransformFeedbackSeparateComponents =
2019308f298300beaa757194a0db8ed50924754c011Paul Berry      BRW_MAX_SOL_BINDINGS / BRW_MAX_SOL_BUFFERS;
2029308f298300beaa757194a0db8ed50924754c011Paul Berry
20349b53407c7c4f08b5e13591fd04080ca602fba40Brian Paul   /* if conformance mode is set, swrast can handle any size AA point */
20449b53407c7c4f08b5e13591fd04080ca602fba40Brian Paul   ctx->Const.MaxPointSizeAA = 255.0;
20549b53407c7c4f08b5e13591fd04080ca602fba40Brian Paul
206a9e753c84cc5acc2a89686a5e4109f3b056d4fb4Brian Paul   /* We want the GLSL compiler to emit code that uses condition codes */
2076d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri   for (i = 0; i <= MESA_SHADER_FRAGMENT; i++) {
20801f9fdc4acd28cc4630a3c71f2d007373f4d979cKenneth Graunke      ctx->ShaderCompilerOptions[i].MaxIfDepth = intel->gen < 6 ? 16 : UINT_MAX;
2092e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      ctx->ShaderCompilerOptions[i].EmitCondCodes = true;
2102e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      ctx->ShaderCompilerOptions[i].EmitNVTempInitialization = true;
2112e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      ctx->ShaderCompilerOptions[i].EmitNoNoise = true;
2122e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      ctx->ShaderCompilerOptions[i].EmitNoMainReturn = true;
2132e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      ctx->ShaderCompilerOptions[i].EmitNoIndirectInput = true;
2142e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      ctx->ShaderCompilerOptions[i].EmitNoIndirectOutput = true;
215a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick
216a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick      ctx->ShaderCompilerOptions[i].EmitNoIndirectUniform =
217a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick	 (i == MESA_SHADER_FRAGMENT);
218a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick      ctx->ShaderCompilerOptions[i].EmitNoIndirectTemp =
219a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick	 (i == MESA_SHADER_FRAGMENT);
2202e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      ctx->ShaderCompilerOptions[i].LowerClipDistance = true;
2216d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri   }
222a9e753c84cc5acc2a89686a5e4109f3b056d4fb4Brian Paul
223eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxNativeInstructions = (16 * 1024);
224eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxAluInstructions = 0;
225eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxTexInstructions = 0;
226eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxTexIndirections = 0;
227eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxNativeAluInstructions = 0;
228eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxNativeTexInstructions = 0;
229eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxNativeTexIndirections = 0;
230eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxNativeAttribs = 16;
231eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxNativeTemps = 256;
232eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxNativeAddressRegs = 1;
23309c73c74376ed6b12e343c89b4eac94285439860Ian Romanick   ctx->Const.VertexProgram.MaxNativeParameters = 1024;
234eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxEnvParams =
235eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick      MIN2(ctx->Const.VertexProgram.MaxNativeParameters,
236eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick	   ctx->Const.VertexProgram.MaxEnvParams);
237eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick
238eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.FragmentProgram.MaxNativeInstructions = (16 * 1024);
239eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.FragmentProgram.MaxNativeAluInstructions = (16 * 1024);
240eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.FragmentProgram.MaxNativeTexInstructions = (16 * 1024);
241eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.FragmentProgram.MaxNativeTexIndirections = (16 * 1024);
242eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.FragmentProgram.MaxNativeAttribs = 12;
243eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.FragmentProgram.MaxNativeTemps = 256;
244eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.FragmentProgram.MaxNativeAddressRegs = 0;
24509c73c74376ed6b12e343c89b4eac94285439860Ian Romanick   ctx->Const.FragmentProgram.MaxNativeParameters = 1024;
246eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.FragmentProgram.MaxEnvParams =
247eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick      MIN2(ctx->Const.FragmentProgram.MaxNativeParameters,
248eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick	   ctx->Const.FragmentProgram.MaxEnvParams);
2499f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2503d028024e581b05f71f0be915657c2c105885de6Ian Romanick   /* Fragment shaders use real, 32-bit twos-complement integers for all
2513d028024e581b05f71f0be915657c2c105885de6Ian Romanick    * integer types.
2523d028024e581b05f71f0be915657c2c105885de6Ian Romanick    */
2532fb0aebd4a248d2a0725099cd5646253c30c1dc3Ian Romanick   ctx->Const.FragmentProgram.LowInt.RangeMin = 31;
2542fb0aebd4a248d2a0725099cd5646253c30c1dc3Ian Romanick   ctx->Const.FragmentProgram.LowInt.RangeMax = 30;
2552fb0aebd4a248d2a0725099cd5646253c30c1dc3Ian Romanick   ctx->Const.FragmentProgram.LowInt.Precision = 0;
2562fb0aebd4a248d2a0725099cd5646253c30c1dc3Ian Romanick   ctx->Const.FragmentProgram.HighInt = ctx->Const.FragmentProgram.MediumInt
2572fb0aebd4a248d2a0725099cd5646253c30c1dc3Ian Romanick      = ctx->Const.FragmentProgram.LowInt;
2583d028024e581b05f71f0be915657c2c105885de6Ian Romanick
259bea6539abff17f39c822ac9c1c94f8249c396b18Zhenyu Wang   /* Gen6 converts quads to polygon in beginning of 3D pipeline,
260bea6539abff17f39c822ac9c1c94f8249c396b18Zhenyu Wang      but we're not sure how it's actually done for vertex order,
261bea6539abff17f39c822ac9c1c94f8249c396b18Zhenyu Wang      that affect provoking vertex decision. Always use last vertex
262bea6539abff17f39c822ac9c1c94f8249c396b18Zhenyu Wang      convention for quad primitive which works as expected for now. */
263fa4b23581b4ee8a07400364dccbd61b749c2d1d1Kenneth Graunke   if (intel->gen >= 6)
2642e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke       ctx->Const.QuadsFollowProvokingVertexConvention = false;
265bea6539abff17f39c822ac9c1c94f8249c396b18Zhenyu Wang
266cdcef6cbf4dd80047819e9098e34a3b98bd502a4Zhenyu Wang   if (intel->is_g4x || intel->gen >= 5) {
267348bdaa529c3eb60fcf03ed4531193bbf2e12491Kenneth Graunke      brw->CMD_VF_STATISTICS = GM45_3DSTATE_VF_STATISTICS;
2680b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt      brw->CMD_PIPELINE_SELECT = CMD_PIPELINE_SELECT_GM45;
2692e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      brw->has_surface_tile_offset = true;
270da1502494b63fcd65bc60f50e59241164481f8b3Zhenyu Wang      if (intel->gen < 6)
2712e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke	  brw->has_compr4 = true;
2722e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      brw->has_aa_line_parameters = true;
2732e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      brw->has_pln = true;
2740b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt  } else {
275348bdaa529c3eb60fcf03ed4531193bbf2e12491Kenneth Graunke      brw->CMD_VF_STATISTICS = GEN4_3DSTATE_VF_STATISTICS;
2760b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt      brw->CMD_PIPELINE_SELECT = CMD_PIPELINE_SELECT_965;
2770b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt   }
2780b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt
2790b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt   /* WM maximum threads is number of EUs times number of threads per EU. */
280477e2fe0318c79978dedd51a5a6039cf05fc59fbKenneth Graunke   if (intel->gen >= 7) {
281490e6470a09c3a6049e5e859d72b0b679ef5d070Kenneth Graunke      if (intel->gt == 1) {
282db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke	 brw->max_wm_threads = 86;
283db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke	 brw->max_vs_threads = 36;
284f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke	 brw->max_gs_threads = 36;
2858832920c298f4e13ffd5e53feeba509be69edb16Kenneth Graunke	 brw->urb.size = 128;
2868832920c298f4e13ffd5e53feeba509be69edb16Kenneth Graunke	 brw->urb.max_vs_entries = 512;
2878832920c298f4e13ffd5e53feeba509be69edb16Kenneth Graunke	 brw->urb.max_gs_entries = 192;
288490e6470a09c3a6049e5e859d72b0b679ef5d070Kenneth Graunke      } else if (intel->gt == 2) {
289db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke	 brw->max_wm_threads = 86;
290db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke	 brw->max_vs_threads = 128;
291f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke	 brw->max_gs_threads = 128;
2928832920c298f4e13ffd5e53feeba509be69edb16Kenneth Graunke	 brw->urb.size = 256;
2938832920c298f4e13ffd5e53feeba509be69edb16Kenneth Graunke	 brw->urb.max_vs_entries = 704;
2948832920c298f4e13ffd5e53feeba509be69edb16Kenneth Graunke	 brw->urb.max_gs_entries = 320;
295477e2fe0318c79978dedd51a5a6039cf05fc59fbKenneth Graunke      } else {
296477e2fe0318c79978dedd51a5a6039cf05fc59fbKenneth Graunke	 assert(!"Unknown gen7 device.");
297477e2fe0318c79978dedd51a5a6039cf05fc59fbKenneth Graunke      }
298477e2fe0318c79978dedd51a5a6039cf05fc59fbKenneth Graunke   } else if (intel->gen == 6) {
299490e6470a09c3a6049e5e859d72b0b679ef5d070Kenneth Graunke      if (intel->gt == 2) {
300904b8ba1bb604b2eaaa22f7f074d236011fe213fEric Anholt	 /* This could possibly be 80, but is supposed to require
301904b8ba1bb604b2eaaa22f7f074d236011fe213fEric Anholt	  * disabling of WIZ hashing (bit 6 of GT_MODE, 0x20d0) and a
302904b8ba1bb604b2eaaa22f7f074d236011fe213fEric Anholt	  * GPU reset to change.
303904b8ba1bb604b2eaaa22f7f074d236011fe213fEric Anholt	  */
304db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke	 brw->max_wm_threads = 40;
305db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke	 brw->max_vs_threads = 60;
306f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke	 brw->max_gs_threads = 60;
30742a805700039e81a9245f46f153e2cd9705cd0d7Kenneth Graunke	 brw->urb.size = 64;            /* volume 5c.5 section 5.1 */
308ef59049c5242a1be7fa59a182d342191185dd62bEric Anholt	 brw->urb.max_vs_entries = 256; /* volume 2a (see 3DSTATE_URB) */
3097a63a311e56fd492823b4b44e526df5a8dc0a021Kenneth Graunke	 brw->urb.max_gs_entries = 256;
310904b8ba1bb604b2eaaa22f7f074d236011fe213fEric Anholt      } else {
311db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke	 brw->max_wm_threads = 40;
312db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke	 brw->max_vs_threads = 24;
313f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke	 brw->max_gs_threads = 21; /* conservative; 24 if rendering disabled */
31442a805700039e81a9245f46f153e2cd9705cd0d7Kenneth Graunke	 brw->urb.size = 32;            /* volume 5c.5 section 5.1 */
315ef59049c5242a1be7fa59a182d342191185dd62bEric Anholt	 brw->urb.max_vs_entries = 128; /* volume 2a (see 3DSTATE_URB) */
3167a63a311e56fd492823b4b44e526df5a8dc0a021Kenneth Graunke	 brw->urb.max_gs_entries = 256;
317904b8ba1bb604b2eaaa22f7f074d236011fe213fEric Anholt      }
31843e39b58c705714c01919e5b4b5566e82e803d58Paul Berry      brw->urb.gen6_gs_previously_active = false;
31935c127362f7b0c186923934f34148de319093cbfZhenyu Wang   } else if (intel->gen == 5) {
3200b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt      brw->urb.size = 1024;
321db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke      brw->max_vs_threads = 72;
322f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke      brw->max_gs_threads = 32;
323db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke      brw->max_wm_threads = 12 * 6;
3240b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt   } else if (intel->is_g4x) {
3250b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt      brw->urb.size = 384;
326db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke      brw->max_vs_threads = 32;
327f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke      brw->max_gs_threads = 2;
328db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke      brw->max_wm_threads = 10 * 5;
32989cce536cbc55460bc534acc06ea9f4d9ae71016Eric Anholt   } else if (intel->gen < 6) {
3300b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt      brw->urb.size = 256;
331db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke      brw->max_vs_threads = 16;
332f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke      brw->max_gs_threads = 2;
333db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke      brw->max_wm_threads = 8 * 4;
3342e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      brw->has_negative_rhw_bug = true;
3350b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt   }
3360b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt
3379f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brw_init_state( brw );
3389f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
339503eb57a003f51c25687e9cf0ad6f7939a757f1bEric Anholt   brw->curbe.last_buf = calloc(1, 4096);
340503eb57a003f51c25687e9cf0ad6f7939a757f1bEric Anholt   brw->curbe.next_buf = calloc(1, 4096);
341503eb57a003f51c25687e9cf0ad6f7939a757f1bEric Anholt
3429f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brw->state.dirty.mesa = ~0;
3439f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brw->state.dirty.brw = ~0;
3449f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3459f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brw->emit_state_always = 0;
3469f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3470ab7d6f437f2f7a1b2d84f30497f3c2013b52791Eric Anholt   intel->batch.need_workaround_flush = true;
3480ab7d6f437f2f7a1b2d84f30497f3c2013b52791Eric Anholt
3492e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   ctx->VertexProgram._MaintainTnlProgram = true;
3502e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   ctx->FragmentProgram._MaintainTexEnvProgram = true;
3519f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3529f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brw_draw_init( brw );
3539f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
354d7c6c8428c9908047c88f2672cd1edf6ba60f785Eric Anholt   brw->new_vs_backend = (getenv("INTEL_OLD_VS") == NULL);
355c6abde211fa875f90e59e3709720cfe394669069Eric Anholt   brw->precompile = driQueryOptionb(&intel->optionCache, "shader_precompile");
3562f82c33deefba61b3e72edb4375850c0629af224Eric Anholt
35755b7fbb70ffc1f4def5c3ded63c3ef569e693731Eric Anholt   /* If we're using the new shader backend, we require integer uniforms
35855b7fbb70ffc1f4def5c3ded63c3ef569e693731Eric Anholt    * stored as actual integers.
35955b7fbb70ffc1f4def5c3ded63c3ef569e693731Eric Anholt    */
3604e64cfbb4ec92877803e70257af8b97c484c00c0Bryan Cain   if (brw->new_vs_backend) {
36155b7fbb70ffc1f4def5c3ded63c3ef569e693731Eric Anholt      ctx->Const.NativeIntegers = true;
3624e64cfbb4ec92877803e70257af8b97c484c00c0Bryan Cain      ctx->Const.UniformBooleanTrue = 1;
3634e64cfbb4ec92877803e70257af8b97c484c00c0Bryan Cain   }
36455b7fbb70ffc1f4def5c3ded63c3ef569e693731Eric Anholt
3652e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
3669f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt}
3679f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
368