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