brw_context.c revision 642247883fb9e6dce9bad724f7f6503321e0ef6f
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
1127f91c8bf2bf08afd297314c02a8869d8919f5f0eEric Anholtstatic void brwInitDriverFunctions(struct intel_screen *screen,
1137f91c8bf2bf08afd297314c02a8869d8919f5f0eEric Anholt				   struct dd_function_table *functions)
1149f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{
1159f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   intelInitDriverFunctions( functions );
116dd1d66fc4ab5d7064113a2017a431c3461598b91Kristian Høgsberg
1179f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brwInitFragProgFuncs( functions );
118c157cfc6376f7469ab272b18868183e5ff9ac754Eric Anholt   brw_init_queryobj_functions(functions);
119b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace
120b95986729ef3522a65b7357aea99c6358f9d53c8Chad Versace   functions->PrepareExecBegin = brwPrepareExecBegin;
12121504b462acda4977c5fdfffc192e73273b8fb26Kenneth Graunke   functions->BeginTransformFeedback = brw_begin_transform_feedback;
1227f91c8bf2bf08afd297314c02a8869d8919f5f0eEric Anholt
1237f91c8bf2bf08afd297314c02a8869d8919f5f0eEric Anholt   if (screen->gen >= 7)
1247f91c8bf2bf08afd297314c02a8869d8919f5f0eEric Anholt      functions->EndTransformFeedback = gen7_end_transform_feedback;
1257f91c8bf2bf08afd297314c02a8869d8919f5f0eEric Anholt   else
1267f91c8bf2bf08afd297314c02a8869d8919f5f0eEric Anholt      functions->EndTransformFeedback = brw_end_transform_feedback;
1279f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt}
1289f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1292e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkebool
1302e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth GraunkebrwCreateContext(int api,
1312e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke	         const struct gl_config *mesaVis,
1322e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke		 __DRIcontext *driContextPriv,
1332e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke	         void *sharedContextPrivate)
1349f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{
1357f91c8bf2bf08afd297314c02a8869d8919f5f0eEric Anholt   __DRIscreen *sPriv = driContextPriv->driScreenPriv;
1367f91c8bf2bf08afd297314c02a8869d8919f5f0eEric Anholt   struct intel_screen *screen = sPriv->driverPrivate;
1379f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   struct dd_function_table functions;
13835d5d5df72a2747262e00e521e650c8974d6c64dEric Anholt   struct brw_context *brw = rzalloc(NULL, struct brw_context);
1399f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   struct intel_context *intel = &brw->intel;
140f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg   struct gl_context *ctx = &intel->ctx;
1416d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri   unsigned i;
1429f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1439f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   if (!brw) {
144298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("%s: failed to alloc context\n", __FUNCTION__);
1452e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
1469f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   }
1479f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1487f91c8bf2bf08afd297314c02a8869d8919f5f0eEric Anholt   brwInitDriverFunctions(screen, &functions);
1499f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1504b69100bdcf26dbb5be4d600b7ca5f5cdf6e8f20Kristian Høgsberg   if (!intelInitContext( intel, api, mesaVis, driContextPriv,
1519f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt			  sharedContextPrivate, &functions )) {
152298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("%s: failed to init intel context\n", __FUNCTION__);
1539f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      FREE(brw);
1542e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
1559f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   }
1569f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
157b393fa91676aba0883d8f5260bd2910777aceb11Chad Versace   brwInitVtbl( brw );
158b393fa91676aba0883d8f5260bd2910777aceb11Chad Versace
159ca10b2d4494798405a5fd654201291944645af5dEric Anholt   brw_init_surface_formats(brw);
160ca10b2d4494798405a5fd654201291944645af5dEric Anholt
1615b6ca237ee63fb85cff3bb942f5136f96f2c81ecXiang, Haihao   /* Initialize swrast, tnl driver tables: */
1625b6ca237ee63fb85cff3bb942f5136f96f2c81ecXiang, Haihao   intelInitSpanFuncs(ctx);
1635b6ca237ee63fb85cff3bb942f5136f96f2c81ecXiang, Haihao
164dd1d66fc4ab5d7064113a2017a431c3461598b91Kristian Høgsberg   TNL_CONTEXT(ctx)->Driver.RunPipeline = _tnl_run_pipeline;
165dd1d66fc4ab5d7064113a2017a431c3461598b91Kristian Høgsberg
166198ec96d364dabd82952a451eeda7937db383f0dBrian Paul   ctx->Const.MaxDrawBuffers = BRW_MAX_DRAW_BUFFERS;
1679f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   ctx->Const.MaxTextureImageUnits = BRW_MAX_TEX_UNIT;
1684a6ad999ea312f0af85de621c8b6a15a3d3b7ffdBrian Paul   ctx->Const.MaxTextureCoordUnits = 8; /* Mesa limit */
1694a6ad999ea312f0af85de621c8b6a15a3d3b7ffdBrian Paul   ctx->Const.MaxTextureUnits = MIN2(ctx->Const.MaxTextureCoordUnits,
1704a6ad999ea312f0af85de621c8b6a15a3d3b7ffdBrian Paul                                     ctx->Const.MaxTextureImageUnits);
17137d24a70daa41bbad9c7a85dd432f561a172e858Kenneth Graunke   ctx->Const.MaxVertexTextureImageUnits = BRW_MAX_TEX_UNIT;
17251e945ec9c0b803f5e998f87449fb02a7c39ae65Eric Anholt   ctx->Const.MaxCombinedTextureImageUnits =
17351e945ec9c0b803f5e998f87449fb02a7c39ae65Eric Anholt      ctx->Const.MaxVertexTextureImageUnits +
17451e945ec9c0b803f5e998f87449fb02a7c39ae65Eric Anholt      ctx->Const.MaxTextureImageUnits;
1759f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
176f61d1deac7d19dcec38b7852a635d92680624a32Chris Wilson   ctx->Const.MaxTextureLevels = 14; /* 8192 */
177f61d1deac7d19dcec38b7852a635d92680624a32Chris Wilson   if (ctx->Const.MaxTextureLevels > MAX_TEXTURE_LEVELS)
178f61d1deac7d19dcec38b7852a635d92680624a32Chris Wilson	   ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
1799f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   ctx->Const.Max3DTextureLevels = 9;
1809f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   ctx->Const.MaxCubeTextureLevels = 12;
1813d4efc583ce46e6f0a13302679fe1349d521a4a3Eric Anholt
1823d4efc583ce46e6f0a13302679fe1349d521a4a3Eric Anholt   if (intel->gen >= 7)
1833d4efc583ce46e6f0a13302679fe1349d521a4a3Eric Anholt      ctx->Const.MaxArrayTextureLayers = 2048;
1843d4efc583ce46e6f0a13302679fe1349d521a4a3Eric Anholt   else
1853d4efc583ce46e6f0a13302679fe1349d521a4a3Eric Anholt      ctx->Const.MaxArrayTextureLayers = 512;
1863d4efc583ce46e6f0a13302679fe1349d521a4a3Eric Anholt
187954dfba12986f578f2d8461818f9e9ac1f8f2b41Keith Packard   ctx->Const.MaxTextureRectSize = (1<<12);
1889f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
18950853be894aa3edd1e9271f7d625f319209e340fRoland Scheidegger   ctx->Const.MaxTextureMaxAnisotropy = 16.0;
19050853be894aa3edd1e9271f7d625f319209e340fRoland Scheidegger
1919308f298300beaa757194a0db8ed50924754c011Paul Berry   /* Hardware only supports a limited number of transform feedback buffers.
1929308f298300beaa757194a0db8ed50924754c011Paul Berry    * So we need to override the Mesa default (which is based only on software
1939308f298300beaa757194a0db8ed50924754c011Paul Berry    * limits).
1949308f298300beaa757194a0db8ed50924754c011Paul Berry    */
1959308f298300beaa757194a0db8ed50924754c011Paul Berry   ctx->Const.MaxTransformFeedbackSeparateAttribs = BRW_MAX_SOL_BUFFERS;
1969308f298300beaa757194a0db8ed50924754c011Paul Berry
1979308f298300beaa757194a0db8ed50924754c011Paul Berry   /* On Gen6, in the worst case, we use up one binding table entry per
1989308f298300beaa757194a0db8ed50924754c011Paul Berry    * transform feedback component (see comments above the definition of
1999308f298300beaa757194a0db8ed50924754c011Paul Berry    * BRW_MAX_SOL_BINDINGS, in brw_context.h), so we need to advertise a value
2009308f298300beaa757194a0db8ed50924754c011Paul Berry    * for MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS equal to
2019308f298300beaa757194a0db8ed50924754c011Paul Berry    * BRW_MAX_SOL_BINDINGS.
2029308f298300beaa757194a0db8ed50924754c011Paul Berry    *
2039308f298300beaa757194a0db8ed50924754c011Paul Berry    * In "separate components" mode, we need to divide this value by
2049308f298300beaa757194a0db8ed50924754c011Paul Berry    * BRW_MAX_SOL_BUFFERS, so that the total number of binding table entries
2059308f298300beaa757194a0db8ed50924754c011Paul Berry    * used up by all buffers will not exceed BRW_MAX_SOL_BINDINGS.
2069308f298300beaa757194a0db8ed50924754c011Paul Berry    */
2079308f298300beaa757194a0db8ed50924754c011Paul Berry   ctx->Const.MaxTransformFeedbackInterleavedComponents = BRW_MAX_SOL_BINDINGS;
2089308f298300beaa757194a0db8ed50924754c011Paul Berry   ctx->Const.MaxTransformFeedbackSeparateComponents =
2099308f298300beaa757194a0db8ed50924754c011Paul Berry      BRW_MAX_SOL_BINDINGS / BRW_MAX_SOL_BUFFERS;
2109308f298300beaa757194a0db8ed50924754c011Paul Berry
211be4e46b21a60cfdc826bf89d1078df54966115b1Eric Anholt   /* Claim to support 4 multisamples, even though we don't.  This is a
212be4e46b21a60cfdc826bf89d1078df54966115b1Eric Anholt    * requirement for GL 3.0 that we missed until the last minute.  Go ahead and
213be4e46b21a60cfdc826bf89d1078df54966115b1Eric Anholt    * claim the limit, so that usage of the 4 multisample-based API that is
214be4e46b21a60cfdc826bf89d1078df54966115b1Eric Anholt    * guaranteed in 3.0 succeeds, even though we only rasterize a single sample.
215be4e46b21a60cfdc826bf89d1078df54966115b1Eric Anholt    */
216be4e46b21a60cfdc826bf89d1078df54966115b1Eric Anholt   if (intel->gen >= 6)
217be4e46b21a60cfdc826bf89d1078df54966115b1Eric Anholt      ctx->Const.MaxSamples = 4;
218be4e46b21a60cfdc826bf89d1078df54966115b1Eric Anholt
21949b53407c7c4f08b5e13591fd04080ca602fba40Brian Paul   /* if conformance mode is set, swrast can handle any size AA point */
22049b53407c7c4f08b5e13591fd04080ca602fba40Brian Paul   ctx->Const.MaxPointSizeAA = 255.0;
22149b53407c7c4f08b5e13591fd04080ca602fba40Brian Paul
222a9e753c84cc5acc2a89686a5e4109f3b056d4fb4Brian Paul   /* We want the GLSL compiler to emit code that uses condition codes */
2236d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri   for (i = 0; i <= MESA_SHADER_FRAGMENT; i++) {
22401f9fdc4acd28cc4630a3c71f2d007373f4d979cKenneth Graunke      ctx->ShaderCompilerOptions[i].MaxIfDepth = intel->gen < 6 ? 16 : UINT_MAX;
2252e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      ctx->ShaderCompilerOptions[i].EmitCondCodes = true;
2262e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      ctx->ShaderCompilerOptions[i].EmitNVTempInitialization = true;
2272e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      ctx->ShaderCompilerOptions[i].EmitNoNoise = true;
2282e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      ctx->ShaderCompilerOptions[i].EmitNoMainReturn = true;
2292e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      ctx->ShaderCompilerOptions[i].EmitNoIndirectInput = true;
2302e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      ctx->ShaderCompilerOptions[i].EmitNoIndirectOutput = true;
231a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick
232a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick      ctx->ShaderCompilerOptions[i].EmitNoIndirectUniform =
233a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick	 (i == MESA_SHADER_FRAGMENT);
234a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick      ctx->ShaderCompilerOptions[i].EmitNoIndirectTemp =
235a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick	 (i == MESA_SHADER_FRAGMENT);
2362e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      ctx->ShaderCompilerOptions[i].LowerClipDistance = true;
2376d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri   }
238a9e753c84cc5acc2a89686a5e4109f3b056d4fb4Brian Paul
239eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxNativeInstructions = (16 * 1024);
240eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxAluInstructions = 0;
241eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxTexInstructions = 0;
242eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxTexIndirections = 0;
243eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxNativeAluInstructions = 0;
244eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxNativeTexInstructions = 0;
245eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxNativeTexIndirections = 0;
246eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxNativeAttribs = 16;
247eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxNativeTemps = 256;
248eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxNativeAddressRegs = 1;
24909c73c74376ed6b12e343c89b4eac94285439860Ian Romanick   ctx->Const.VertexProgram.MaxNativeParameters = 1024;
250eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.VertexProgram.MaxEnvParams =
251eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick      MIN2(ctx->Const.VertexProgram.MaxNativeParameters,
252eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick	   ctx->Const.VertexProgram.MaxEnvParams);
253eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick
254eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.FragmentProgram.MaxNativeInstructions = (16 * 1024);
255eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.FragmentProgram.MaxNativeAluInstructions = (16 * 1024);
256eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.FragmentProgram.MaxNativeTexInstructions = (16 * 1024);
257eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.FragmentProgram.MaxNativeTexIndirections = (16 * 1024);
258eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.FragmentProgram.MaxNativeAttribs = 12;
259eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.FragmentProgram.MaxNativeTemps = 256;
260eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.FragmentProgram.MaxNativeAddressRegs = 0;
26109c73c74376ed6b12e343c89b4eac94285439860Ian Romanick   ctx->Const.FragmentProgram.MaxNativeParameters = 1024;
262eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick   ctx->Const.FragmentProgram.MaxEnvParams =
263eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick      MIN2(ctx->Const.FragmentProgram.MaxNativeParameters,
264eabe12df44a41e97fb5736959e8864ddbd01be14Ian Romanick	   ctx->Const.FragmentProgram.MaxEnvParams);
2659f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2663d028024e581b05f71f0be915657c2c105885de6Ian Romanick   /* Fragment shaders use real, 32-bit twos-complement integers for all
2673d028024e581b05f71f0be915657c2c105885de6Ian Romanick    * integer types.
2683d028024e581b05f71f0be915657c2c105885de6Ian Romanick    */
2692fb0aebd4a248d2a0725099cd5646253c30c1dc3Ian Romanick   ctx->Const.FragmentProgram.LowInt.RangeMin = 31;
2702fb0aebd4a248d2a0725099cd5646253c30c1dc3Ian Romanick   ctx->Const.FragmentProgram.LowInt.RangeMax = 30;
2712fb0aebd4a248d2a0725099cd5646253c30c1dc3Ian Romanick   ctx->Const.FragmentProgram.LowInt.Precision = 0;
2722fb0aebd4a248d2a0725099cd5646253c30c1dc3Ian Romanick   ctx->Const.FragmentProgram.HighInt = ctx->Const.FragmentProgram.MediumInt
2732fb0aebd4a248d2a0725099cd5646253c30c1dc3Ian Romanick      = ctx->Const.FragmentProgram.LowInt;
2743d028024e581b05f71f0be915657c2c105885de6Ian Romanick
275bea6539abff17f39c822ac9c1c94f8249c396b18Zhenyu Wang   /* Gen6 converts quads to polygon in beginning of 3D pipeline,
276bea6539abff17f39c822ac9c1c94f8249c396b18Zhenyu Wang      but we're not sure how it's actually done for vertex order,
277bea6539abff17f39c822ac9c1c94f8249c396b18Zhenyu Wang      that affect provoking vertex decision. Always use last vertex
278bea6539abff17f39c822ac9c1c94f8249c396b18Zhenyu Wang      convention for quad primitive which works as expected for now. */
279fa4b23581b4ee8a07400364dccbd61b749c2d1d1Kenneth Graunke   if (intel->gen >= 6)
2802e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke       ctx->Const.QuadsFollowProvokingVertexConvention = false;
281bea6539abff17f39c822ac9c1c94f8249c396b18Zhenyu Wang
282cdcef6cbf4dd80047819e9098e34a3b98bd502a4Zhenyu Wang   if (intel->is_g4x || intel->gen >= 5) {
283348bdaa529c3eb60fcf03ed4531193bbf2e12491Kenneth Graunke      brw->CMD_VF_STATISTICS = GM45_3DSTATE_VF_STATISTICS;
2840b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt      brw->CMD_PIPELINE_SELECT = CMD_PIPELINE_SELECT_GM45;
2852e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      brw->has_surface_tile_offset = true;
286da1502494b63fcd65bc60f50e59241164481f8b3Zhenyu Wang      if (intel->gen < 6)
2872e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke	  brw->has_compr4 = true;
2882e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      brw->has_aa_line_parameters = true;
2892e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      brw->has_pln = true;
2900b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt  } else {
291348bdaa529c3eb60fcf03ed4531193bbf2e12491Kenneth Graunke      brw->CMD_VF_STATISTICS = GEN4_3DSTATE_VF_STATISTICS;
2920b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt      brw->CMD_PIPELINE_SELECT = CMD_PIPELINE_SELECT_965;
2930b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt   }
2940b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt
2950b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt   /* WM maximum threads is number of EUs times number of threads per EU. */
296477e2fe0318c79978dedd51a5a6039cf05fc59fbKenneth Graunke   if (intel->gen >= 7) {
297490e6470a09c3a6049e5e859d72b0b679ef5d070Kenneth Graunke      if (intel->gt == 1) {
298db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke	 brw->max_wm_threads = 86;
299db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke	 brw->max_vs_threads = 36;
300f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke	 brw->max_gs_threads = 36;
3018832920c298f4e13ffd5e53feeba509be69edb16Kenneth Graunke	 brw->urb.size = 128;
3028832920c298f4e13ffd5e53feeba509be69edb16Kenneth Graunke	 brw->urb.max_vs_entries = 512;
3038832920c298f4e13ffd5e53feeba509be69edb16Kenneth Graunke	 brw->urb.max_gs_entries = 192;
304490e6470a09c3a6049e5e859d72b0b679ef5d070Kenneth Graunke      } else if (intel->gt == 2) {
305db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke	 brw->max_wm_threads = 86;
306db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke	 brw->max_vs_threads = 128;
307f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke	 brw->max_gs_threads = 128;
3088832920c298f4e13ffd5e53feeba509be69edb16Kenneth Graunke	 brw->urb.size = 256;
3098832920c298f4e13ffd5e53feeba509be69edb16Kenneth Graunke	 brw->urb.max_vs_entries = 704;
3108832920c298f4e13ffd5e53feeba509be69edb16Kenneth Graunke	 brw->urb.max_gs_entries = 320;
311477e2fe0318c79978dedd51a5a6039cf05fc59fbKenneth Graunke      } else {
312477e2fe0318c79978dedd51a5a6039cf05fc59fbKenneth Graunke	 assert(!"Unknown gen7 device.");
313477e2fe0318c79978dedd51a5a6039cf05fc59fbKenneth Graunke      }
314477e2fe0318c79978dedd51a5a6039cf05fc59fbKenneth Graunke   } else if (intel->gen == 6) {
315490e6470a09c3a6049e5e859d72b0b679ef5d070Kenneth Graunke      if (intel->gt == 2) {
316904b8ba1bb604b2eaaa22f7f074d236011fe213fEric Anholt	 /* This could possibly be 80, but is supposed to require
317904b8ba1bb604b2eaaa22f7f074d236011fe213fEric Anholt	  * disabling of WIZ hashing (bit 6 of GT_MODE, 0x20d0) and a
318904b8ba1bb604b2eaaa22f7f074d236011fe213fEric Anholt	  * GPU reset to change.
319904b8ba1bb604b2eaaa22f7f074d236011fe213fEric Anholt	  */
320db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke	 brw->max_wm_threads = 40;
321db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke	 brw->max_vs_threads = 60;
322f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke	 brw->max_gs_threads = 60;
32342a805700039e81a9245f46f153e2cd9705cd0d7Kenneth Graunke	 brw->urb.size = 64;            /* volume 5c.5 section 5.1 */
324ef59049c5242a1be7fa59a182d342191185dd62bEric Anholt	 brw->urb.max_vs_entries = 256; /* volume 2a (see 3DSTATE_URB) */
3257a63a311e56fd492823b4b44e526df5a8dc0a021Kenneth Graunke	 brw->urb.max_gs_entries = 256;
326904b8ba1bb604b2eaaa22f7f074d236011fe213fEric Anholt      } else {
327db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke	 brw->max_wm_threads = 40;
328db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke	 brw->max_vs_threads = 24;
329f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke	 brw->max_gs_threads = 21; /* conservative; 24 if rendering disabled */
33042a805700039e81a9245f46f153e2cd9705cd0d7Kenneth Graunke	 brw->urb.size = 32;            /* volume 5c.5 section 5.1 */
331dc435ae774b1deed3d00b7c7d33133c08b626737Paul Berry	 brw->urb.max_vs_entries = 256; /* volume 2a (see 3DSTATE_URB) */
3327a63a311e56fd492823b4b44e526df5a8dc0a021Kenneth Graunke	 brw->urb.max_gs_entries = 256;
333904b8ba1bb604b2eaaa22f7f074d236011fe213fEric Anholt      }
33443e39b58c705714c01919e5b4b5566e82e803d58Paul Berry      brw->urb.gen6_gs_previously_active = false;
33535c127362f7b0c186923934f34148de319093cbfZhenyu Wang   } else if (intel->gen == 5) {
3360b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt      brw->urb.size = 1024;
337db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke      brw->max_vs_threads = 72;
338f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke      brw->max_gs_threads = 32;
339db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke      brw->max_wm_threads = 12 * 6;
3400b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt   } else if (intel->is_g4x) {
3410b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt      brw->urb.size = 384;
342db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke      brw->max_vs_threads = 32;
343f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke      brw->max_gs_threads = 2;
344db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke      brw->max_wm_threads = 10 * 5;
34589cce536cbc55460bc534acc06ea9f4d9ae71016Eric Anholt   } else if (intel->gen < 6) {
3460b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt      brw->urb.size = 256;
347db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke      brw->max_vs_threads = 16;
348f1694eabdd860c3026dc691474caee83fce7bb52Kenneth Graunke      brw->max_gs_threads = 2;
349db6dd6d88fdc4361193dd063e4f150f01a104faaKenneth Graunke      brw->max_wm_threads = 8 * 4;
3502e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      brw->has_negative_rhw_bug = true;
3510b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt   }
3520b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt
3539f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brw_init_state( brw );
3549f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
355503eb57a003f51c25687e9cf0ad6f7939a757f1bEric Anholt   brw->curbe.last_buf = calloc(1, 4096);
356503eb57a003f51c25687e9cf0ad6f7939a757f1bEric Anholt   brw->curbe.next_buf = calloc(1, 4096);
357503eb57a003f51c25687e9cf0ad6f7939a757f1bEric Anholt
3589f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brw->state.dirty.mesa = ~0;
3599f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brw->state.dirty.brw = ~0;
3609f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3619f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brw->emit_state_always = 0;
3629f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3630ab7d6f437f2f7a1b2d84f30497f3c2013b52791Eric Anholt   intel->batch.need_workaround_flush = true;
3640ab7d6f437f2f7a1b2d84f30497f3c2013b52791Eric Anholt
3652e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   ctx->VertexProgram._MaintainTnlProgram = true;
3662e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   ctx->FragmentProgram._MaintainTexEnvProgram = true;
3679f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3689f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brw_draw_init( brw );
3699f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
370c6abde211fa875f90e59e3709720cfe394669069Eric Anholt   brw->precompile = driQueryOptionb(&intel->optionCache, "shader_precompile");
3712f82c33deefba61b3e72edb4375850c0629af224Eric Anholt
372bdedd03b701781c8b71e162f7eb834e6a11105deKenneth Graunke   ctx->Const.NativeIntegers = true;
373bdedd03b701781c8b71e162f7eb834e6a11105deKenneth Graunke   ctx->Const.UniformBooleanTrue = 1;
37455b7fbb70ffc1f4def5c3ded63c3ef569e693731Eric Anholt
375642247883fb9e6dce9bad724f7f6503321e0ef6fEric Anholt   ctx->Const.ForceGLSLExtensionsWarn = driQueryOptionb(&intel->optionCache, "force_glsl_extensions_warn");
376642247883fb9e6dce9bad724f7f6503321e0ef6fEric Anholt
3772e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
3789f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt}
3799f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
380