17d608d0c331c101088273655708965fb9f1be56eKenneth Graunke/*
27d608d0c331c101088273655708965fb9f1be56eKenneth Graunke * Copyright © 2011 Intel Corporation
37d608d0c331c101088273655708965fb9f1be56eKenneth Graunke *
47d608d0c331c101088273655708965fb9f1be56eKenneth Graunke * Permission is hereby granted, free of charge, to any person obtaining a
57d608d0c331c101088273655708965fb9f1be56eKenneth Graunke * copy of this software and associated documentation files (the "Software"),
67d608d0c331c101088273655708965fb9f1be56eKenneth Graunke * to deal in the Software without restriction, including without limitation
77d608d0c331c101088273655708965fb9f1be56eKenneth Graunke * the rights to use, copy, modify, merge, publish, distribute, sublicense,
87d608d0c331c101088273655708965fb9f1be56eKenneth Graunke * and/or sell copies of the Software, and to permit persons to whom the
97d608d0c331c101088273655708965fb9f1be56eKenneth Graunke * Software is furnished to do so, subject to the following conditions:
107d608d0c331c101088273655708965fb9f1be56eKenneth Graunke *
117d608d0c331c101088273655708965fb9f1be56eKenneth Graunke * The above copyright notice and this permission notice (including the next
127d608d0c331c101088273655708965fb9f1be56eKenneth Graunke * paragraph) shall be included in all copies or substantial portions of the
137d608d0c331c101088273655708965fb9f1be56eKenneth Graunke * Software.
147d608d0c331c101088273655708965fb9f1be56eKenneth Graunke *
157d608d0c331c101088273655708965fb9f1be56eKenneth Graunke * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
167d608d0c331c101088273655708965fb9f1be56eKenneth Graunke * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
177d608d0c331c101088273655708965fb9f1be56eKenneth Graunke * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
187d608d0c331c101088273655708965fb9f1be56eKenneth Graunke * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
197d608d0c331c101088273655708965fb9f1be56eKenneth Graunke * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
207d608d0c331c101088273655708965fb9f1be56eKenneth Graunke * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
217d608d0c331c101088273655708965fb9f1be56eKenneth Graunke * IN THE SOFTWARE.
227d608d0c331c101088273655708965fb9f1be56eKenneth Graunke */
237d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
247d608d0c331c101088273655708965fb9f1be56eKenneth Graunke#include "brw_context.h"
257d608d0c331c101088273655708965fb9f1be56eKenneth Graunke#include "brw_state.h"
267d608d0c331c101088273655708965fb9f1be56eKenneth Graunke#include "brw_defines.h"
277d608d0c331c101088273655708965fb9f1be56eKenneth Graunke#include "brw_util.h"
287d608d0c331c101088273655708965fb9f1be56eKenneth Graunke#include "main/macros.h"
294433b0302d0aa9dc61002e8bb4fd1b752b0be338Brian Paul#include "main/fbobject.h"
307d608d0c331c101088273655708965fb9f1be56eKenneth Graunke#include "intel_batchbuffer.h"
317d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
327d608d0c331c101088273655708965fb9f1be56eKenneth Graunkestatic void
337d608d0c331c101088273655708965fb9f1be56eKenneth Graunkeupload_sbe_state(struct brw_context *brw)
347d608d0c331c101088273655708965fb9f1be56eKenneth Graunke{
357d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   struct intel_context *intel = &brw->intel;
367d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   struct gl_context *ctx = &intel->ctx;
377d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* BRW_NEW_FRAGMENT_PROGRAM */
38c163072197b56e76b656cc472bbe6df650cf11baPaul Berry   uint32_t num_outputs = _mesa_bitcount_64(brw->fragment_program->Base.InputsRead);
395aa96286e7e1a5380673eb75e8653616b48751fdPaul Berry   /* _NEW_LIGHT */
405aa96286e7e1a5380673eb75e8653616b48751fdPaul Berry   bool shade_model_flat = ctx->Light.ShadeModel == GL_FLAT;
417d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   uint32_t dw1, dw10, dw11;
427d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   int i;
435edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke   int attr = 0, input_index = 0;
442a6d43204024bc47df9bf5f7803d62d4d9580ab5Paul Berry   int urb_entry_read_offset = 1;
455edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke   uint16_t attr_overrides[FRAG_ATTRIB_MAX];
46eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu   /* _NEW_BUFFERS */
474433b0302d0aa9dc61002e8bb4fd1b752b0be338Brian Paul   bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer);
48eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu   uint32_t point_sprite_origin;
497d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
507d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* FINISHME: Attribute Swizzle Control Mode? */
51dddc5df5192931f40da4f9a4a3b7b59438bc908aKenneth Graunke   dw1 = GEN7_SBE_SWIZZLE_ENABLE | num_outputs << GEN7_SBE_NUM_OUTPUTS_SHIFT;
527d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
53eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu   /* _NEW_POINT
54eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu    *
55eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu    * Window coordinates in an FBO are inverted, which means point
56eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu    * sprite origin must be inverted.
57eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu    */
58eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu   if ((ctx->Point.SpriteOrigin == GL_LOWER_LEFT) != render_to_fbo) {
59eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu      point_sprite_origin = GEN6_SF_POINT_SPRITE_LOWERLEFT;
60eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu   } else {
61eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu      point_sprite_origin = GEN6_SF_POINT_SPRITE_UPPERLEFT;
62eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu   }
63eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu   dw1 |= point_sprite_origin;
64eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu
657d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
667d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   dw10 = 0;
677d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   dw11 = 0;
687d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
695edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke   /* Create the mapping from the FS inputs we produce to the VS outputs
705edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke    * they source from.
715edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke    */
722de8874ec37bfc548de2e16bbefa51341e25d340Kenneth Graunke   uint32_t max_source_attr = 0;
735edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke   for (; attr < FRAG_ATTRIB_MAX; attr++) {
745aa96286e7e1a5380673eb75e8653616b48751fdPaul Berry      enum glsl_interp_qualifier interp_qualifier =
755aa96286e7e1a5380673eb75e8653616b48751fdPaul Berry         brw->fragment_program->InterpQualifier[attr];
765aa96286e7e1a5380673eb75e8653616b48751fdPaul Berry      bool is_gl_Color = attr == FRAG_ATTRIB_COL0 || attr == FRAG_ATTRIB_COL1;
775aa96286e7e1a5380673eb75e8653616b48751fdPaul Berry
785edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke      if (!(brw->fragment_program->Base.InputsRead & BITFIELD64_BIT(attr)))
795edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke	 continue;
805edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke
81147d0102952b7c0b16906c08da2ae447ec68185aKenneth Graunke      if (ctx->Point.PointSprite &&
82147d0102952b7c0b16906c08da2ae447ec68185aKenneth Graunke	  attr >= FRAG_ATTRIB_TEX0 && attr <= FRAG_ATTRIB_TEX7 &&
83147d0102952b7c0b16906c08da2ae447ec68185aKenneth Graunke	  ctx->Point.CoordReplace[attr - FRAG_ATTRIB_TEX0]) {
84147d0102952b7c0b16906c08da2ae447ec68185aKenneth Graunke	 dw10 |= (1 << input_index);
85147d0102952b7c0b16906c08da2ae447ec68185aKenneth Graunke      }
86147d0102952b7c0b16906c08da2ae447ec68185aKenneth Graunke
87186e37c75454965e1a58298e878a9585f4866749Kenneth Graunke      if (attr == FRAG_ATTRIB_PNTC)
88186e37c75454965e1a58298e878a9585f4866749Kenneth Graunke	 dw10 |= (1 << input_index);
89186e37c75454965e1a58298e878a9585f4866749Kenneth Graunke
90cd6b8421cac2df89dc6365ce368232e461caffcdYuanhan Liu      /* flat shading */
915aa96286e7e1a5380673eb75e8653616b48751fdPaul Berry      if (interp_qualifier == INTERP_QUALIFIER_FLAT ||
925aa96286e7e1a5380673eb75e8653616b48751fdPaul Berry          (shade_model_flat && is_gl_Color &&
935aa96286e7e1a5380673eb75e8653616b48751fdPaul Berry           interp_qualifier == INTERP_QUALIFIER_NONE))
945aa96286e7e1a5380673eb75e8653616b48751fdPaul Berry         dw11 |= (1 << input_index);
95cd6b8421cac2df89dc6365ce368232e461caffcdYuanhan Liu
965edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke      /* The hardware can only do the overrides on 16 overrides at a
975edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke       * time, and the other up to 16 have to be lined up so that the
985edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke       * input index = the output index.  We'll need to do some
995edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke       * tweaking to make sure that's the case.
1005edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke       */
1015edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke      assert(input_index < 16 || attr == input_index);
1025edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke
103f0cecd43d6b6d3f5def3fd43b9c95baaf3be9b16Eric Anholt      /* CACHE_NEW_VS_PROG | _NEW_LIGHT | _NEW_PROGRAM */
1042d909f431c67d0c8c5075dc40f2901076c5bc48bPaul Berry      attr_overrides[input_index++] =
105f0cecd43d6b6d3f5def3fd43b9c95baaf3be9b16Eric Anholt         get_attr_override(&brw->vs.prog_data->vue_map,
106f0cecd43d6b6d3f5def3fd43b9c95baaf3be9b16Eric Anholt			   urb_entry_read_offset, attr,
1072de8874ec37bfc548de2e16bbefa51341e25d340Kenneth Graunke                           ctx->VertexProgram._TwoSideEnabled,
1082de8874ec37bfc548de2e16bbefa51341e25d340Kenneth Graunke                           &max_source_attr);
1095edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke   }
1105edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke
111dddc5df5192931f40da4f9a4a3b7b59438bc908aKenneth Graunke   /* From the Ivy Bridge PRM, Volume 2, Part 1, documentation for
112dddc5df5192931f40da4f9a4a3b7b59438bc908aKenneth Graunke    * 3DSTATE_SBE DWord 1 bits 15:11, "Vertex URB Entry Read Length":
113dddc5df5192931f40da4f9a4a3b7b59438bc908aKenneth Graunke    *
114dddc5df5192931f40da4f9a4a3b7b59438bc908aKenneth Graunke    * "This field should be set to the minimum length required to read the
115dddc5df5192931f40da4f9a4a3b7b59438bc908aKenneth Graunke    *  maximum source attribute.  The maximum source attribute is indicated
116dddc5df5192931f40da4f9a4a3b7b59438bc908aKenneth Graunke    *  by the maximum value of the enabled Attribute # Source Attribute if
117dddc5df5192931f40da4f9a4a3b7b59438bc908aKenneth Graunke    *  Attribute Swizzle Enable is set, Number of Output Attributes-1 if
118dddc5df5192931f40da4f9a4a3b7b59438bc908aKenneth Graunke    *  enable is not set.
119dddc5df5192931f40da4f9a4a3b7b59438bc908aKenneth Graunke    *
120dddc5df5192931f40da4f9a4a3b7b59438bc908aKenneth Graunke    *  read_length = ceiling((max_source_attr + 1) / 2)"
121dddc5df5192931f40da4f9a4a3b7b59438bc908aKenneth Graunke    */
122dddc5df5192931f40da4f9a4a3b7b59438bc908aKenneth Graunke   uint32_t urb_entry_read_length = ALIGN(max_source_attr + 1, 2) / 2;
123dddc5df5192931f40da4f9a4a3b7b59438bc908aKenneth Graunke   dw1 |= urb_entry_read_length << GEN7_SBE_URB_ENTRY_READ_LENGTH_SHIFT |
124dddc5df5192931f40da4f9a4a3b7b59438bc908aKenneth Graunke          urb_entry_read_offset << GEN7_SBE_URB_ENTRY_READ_OFFSET_SHIFT;
125dddc5df5192931f40da4f9a4a3b7b59438bc908aKenneth Graunke
126a48cc138a8b7c55f8d12796677e081c2b2085f48Kenneth Graunke   for (; input_index < FRAG_ATTRIB_MAX; input_index++)
127a48cc138a8b7c55f8d12796677e081c2b2085f48Kenneth Graunke      attr_overrides[input_index] = 0;
1285edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke
1297d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   BEGIN_BATCH(14);
1307d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH(_3DSTATE_SBE << 16 | (14 - 2));
1317d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH(dw1);
1327d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1337d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* Output dwords 2 through 9 */
1347d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   for (i = 0; i < 8; i++) {
1355edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke      OUT_BATCH(attr_overrides[i * 2] | attr_overrides[i * 2 + 1] << 16);
1367d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   }
1377d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1387d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH(dw10); /* point sprite texcoord bitmask */
1397d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH(dw11); /* constant interp bitmask */
1407d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH(0); /* wrapshortest enables 0-7 */
1417d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH(0); /* wrapshortest enables 8-15 */
1427d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   ADVANCE_BATCH();
1437d608d0c331c101088273655708965fb9f1be56eKenneth Graunke}
1447d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1457d608d0c331c101088273655708965fb9f1be56eKenneth Graunkeconst struct brw_tracked_state gen7_sbe_state = {
1467d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   .dirty = {
147a3d2e3e061f219edc684e46b4c27d3fbcf322c18Kenneth Graunke      .mesa  = (_NEW_BUFFERS |
148a3d2e3e061f219edc684e46b4c27d3fbcf322c18Kenneth Graunke		_NEW_LIGHT |
1497d608d0c331c101088273655708965fb9f1be56eKenneth Graunke		_NEW_POINT |
1509f3d3216cf25d8ffed4d72fbce6feacbc2990e4bEric Anholt		_NEW_PROGRAM),
1517d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      .brw   = (BRW_NEW_CONTEXT |
1527b36c68ba6899c7f30fd56b7ef07a78b027771acChad Versace		BRW_NEW_FRAGMENT_PROGRAM),
1537d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      .cache = CACHE_NEW_VS_PROG
1547d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   },
1557d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   .emit = upload_sbe_state,
1567d608d0c331c101088273655708965fb9f1be56eKenneth Graunke};
1577d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1587d608d0c331c101088273655708965fb9f1be56eKenneth Graunkestatic void
1597d608d0c331c101088273655708965fb9f1be56eKenneth Graunkeupload_sf_state(struct brw_context *brw)
1607d608d0c331c101088273655708965fb9f1be56eKenneth Graunke{
1617d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   struct intel_context *intel = &brw->intel;
1627d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   struct gl_context *ctx = &intel->ctx;
1637d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   uint32_t dw1, dw2, dw3;
1647d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   float point_size;
1657d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* _NEW_BUFFERS */
1664433b0302d0aa9dc61002e8bb4fd1b752b0be338Brian Paul   bool render_to_fbo = _mesa_is_user_fbo(brw->intel.ctx.DrawBuffer);
16797fc89c6cbaa3b5ef7f678d2dc2c7d5bbba05315Paul Berry   bool multisampled_fbo = ctx->DrawBuffer->Visual.samples > 1;
1687d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1697b36c68ba6899c7f30fd56b7ef07a78b027771acChad Versace   dw1 = GEN6_SF_STATISTICS_ENABLE |
1707b36c68ba6899c7f30fd56b7ef07a78b027771acChad Versace         GEN6_SF_VIEWPORT_TRANSFORM_ENABLE;
1717d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
172a98dd64af750fb6dae54b2dc02e0c5a3711156afEric Anholt   /* _NEW_BUFFERS */
173d84a180417d1eabd680554970f1eaaa93abcd41eEric Anholt   dw1 |= (brw_depthbuffer_format(brw) << GEN7_SF_DEPTH_BUFFER_SURFACE_FORMAT_SHIFT);
1748c8985bdd714f43a96ce922a7c0284d50aec3d1aKenneth Graunke
1757d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* _NEW_POLYGON */
1767d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   if ((ctx->Polygon.FrontFace == GL_CCW) ^ render_to_fbo)
1777d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      dw1 |= GEN6_SF_WINDING_CCW;
1787d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1797d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   if (ctx->Polygon.OffsetFill)
1807d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       dw1 |= GEN6_SF_GLOBAL_DEPTH_OFFSET_SOLID;
1817d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1827d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   if (ctx->Polygon.OffsetLine)
1837d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       dw1 |= GEN6_SF_GLOBAL_DEPTH_OFFSET_WIREFRAME;
1847d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1857d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   if (ctx->Polygon.OffsetPoint)
1867d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       dw1 |= GEN6_SF_GLOBAL_DEPTH_OFFSET_POINT;
1877d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1887d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   switch (ctx->Polygon.FrontMode) {
1897d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   case GL_FILL:
1907d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       dw1 |= GEN6_SF_FRONT_SOLID;
1917d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       break;
1927d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1937d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   case GL_LINE:
1947d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       dw1 |= GEN6_SF_FRONT_WIREFRAME;
1957d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       break;
1967d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1977d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   case GL_POINT:
1987d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       dw1 |= GEN6_SF_FRONT_POINT;
1997d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       break;
2007d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2017d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   default:
2027d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       assert(0);
2037d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       break;
2047d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   }
2057d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2067d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   switch (ctx->Polygon.BackMode) {
2077d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   case GL_FILL:
2087d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       dw1 |= GEN6_SF_BACK_SOLID;
2097d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       break;
2107d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2117d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   case GL_LINE:
2127d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       dw1 |= GEN6_SF_BACK_WIREFRAME;
2137d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       break;
2147d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2157d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   case GL_POINT:
2167d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       dw1 |= GEN6_SF_BACK_POINT;
2177d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       break;
2187d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2197d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   default:
2207d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       assert(0);
2217d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       break;
2227d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   }
2237d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2247d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   dw2 = 0;
2257d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2267d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   if (ctx->Polygon.CullFlag) {
2277d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      switch (ctx->Polygon.CullFaceMode) {
2287d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      case GL_FRONT:
2297d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 dw2 |= GEN6_SF_CULL_FRONT;
2307d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 break;
2317d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      case GL_BACK:
2327d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 dw2 |= GEN6_SF_CULL_BACK;
2337d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 break;
2347d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      case GL_FRONT_AND_BACK:
2357d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 dw2 |= GEN6_SF_CULL_BOTH;
2367d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 break;
2377d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      default:
2387d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 assert(0);
2397d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 break;
2407d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      }
2417d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   } else {
2427d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      dw2 |= GEN6_SF_CULL_NONE;
2437d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   }
2447d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2457d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* _NEW_SCISSOR */
2467d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   if (ctx->Scissor.Enabled)
2477d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      dw2 |= GEN6_SF_SCISSOR_ENABLE;
2487d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2497d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* _NEW_LINE */
25019e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry   {
25119e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry      uint32_t line_width_u3_7 = U_FIXED(CLAMP(ctx->Line.Width, 0.0, 7.99), 7);
25219e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry      /* TODO: line width of 0 is not allowed when MSAA enabled */
25319e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry      if (line_width_u3_7 == 0)
25419e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry         line_width_u3_7 = 1;
25519e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry      dw2 |= line_width_u3_7 << GEN6_SF_LINE_WIDTH_SHIFT;
25619e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry   }
2577d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   if (ctx->Line.SmoothFlag) {
2587d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      dw2 |= GEN6_SF_LINE_AA_ENABLE;
2597d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      dw2 |= GEN6_SF_LINE_END_CAP_WIDTH_1_0;
2607d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   }
261b4410ac3944ee30bbf5455e3e649b73f559a7d38Kenneth Graunke   if (ctx->Line.StippleFlag && intel->is_haswell) {
262b4410ac3944ee30bbf5455e3e649b73f559a7d38Kenneth Graunke      dw2 |= HSW_SF_LINE_STIPPLE_ENABLE;
263b4410ac3944ee30bbf5455e3e649b73f559a7d38Kenneth Graunke   }
264cde6544ad7cbc0f4567d294e4d2ac4214199c6ecPaul Berry   /* _NEW_MULTISAMPLE */
265cde6544ad7cbc0f4567d294e4d2ac4214199c6ecPaul Berry   if (multisampled_fbo && ctx->Multisample.Enabled)
26619e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry      dw2 |= GEN6_SF_MSRAST_ON_PATTERN;
2677d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2687d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* FINISHME: Last Pixel Enable?  Vertex Sub Pixel Precision Select?
2697d608d0c331c101088273655708965fb9f1be56eKenneth Graunke    */
2707d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
271ba36bd0375d89e78e3c2ffb923b9ba7af0e4bfb9Kenneth Graunke   dw3 = GEN6_SF_LINE_AA_MODE_TRUE;
2727d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
273ef034f109427f1a8d31dbe10beed825881130f6bKenneth Graunke   /* _NEW_PROGRAM | _NEW_POINT */
2747d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   if (!(ctx->VertexProgram.PointSizeEnabled || ctx->Point._Attenuated))
2757d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      dw3 |= GEN6_SF_USE_STATE_POINT_WIDTH;
2767d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2777d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* Clamp to ARB_point_parameters user limits */
2787d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   point_size = CLAMP(ctx->Point.Size, ctx->Point.MinSize, ctx->Point.MaxSize);
2797d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2807d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* Clamp to the hardware limits and convert to fixed point */
2817d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   dw3 |= U_FIXED(CLAMP(point_size, 0.125, 255.875), 3);
2827d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2837d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* _NEW_LIGHT */
2847d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   if (ctx->Light.ProvokingVertex != GL_FIRST_VERTEX_CONVENTION) {
2857d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      dw3 |=
2867d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 (2 << GEN6_SF_TRI_PROVOKE_SHIFT) |
2877d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 (2 << GEN6_SF_TRIFAN_PROVOKE_SHIFT) |
2887d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 (1 << GEN6_SF_LINE_PROVOKE_SHIFT);
2897d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   } else {
2907d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      dw3 |= (1 << GEN6_SF_TRIFAN_PROVOKE_SHIFT);
2917d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   }
2927d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2937d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   BEGIN_BATCH(7);
2947d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH(_3DSTATE_SF << 16 | (7 - 2));
2957d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH(dw1);
2967d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH(dw2);
2977d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH(dw3);
2987d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH_F(ctx->Polygon.OffsetUnits * 2); /* constant.  copied from gen4 */
2997d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH_F(ctx->Polygon.OffsetFactor); /* scale */
3007d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH_F(0.0); /* XXX: global depth offset clamp */
3017d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   ADVANCE_BATCH();
3027d608d0c331c101088273655708965fb9f1be56eKenneth Graunke}
3037d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
3047d608d0c331c101088273655708965fb9f1be56eKenneth Graunkeconst struct brw_tracked_state gen7_sf_state = {
3057d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   .dirty = {
3067d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      .mesa  = (_NEW_LIGHT |
307447c488d77ea9710e0ffc238953917189d3000c7Eric Anholt		_NEW_PROGRAM |
3087d608d0c331c101088273655708965fb9f1be56eKenneth Graunke		_NEW_POLYGON |
3097d608d0c331c101088273655708965fb9f1be56eKenneth Graunke		_NEW_LINE |
3107d608d0c331c101088273655708965fb9f1be56eKenneth Graunke		_NEW_SCISSOR |
3117d608d0c331c101088273655708965fb9f1be56eKenneth Graunke		_NEW_BUFFERS |
312cde6544ad7cbc0f4567d294e4d2ac4214199c6ecPaul Berry		_NEW_POINT |
313cde6544ad7cbc0f4567d294e4d2ac4214199c6ecPaul Berry                _NEW_MULTISAMPLE),
3147b36c68ba6899c7f30fd56b7ef07a78b027771acChad Versace      .brw   = BRW_NEW_CONTEXT,
3157d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      .cache = CACHE_NEW_VS_PROG
3167d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   },
3177d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   .emit = upload_sf_state,
3187d608d0c331c101088273655708965fb9f1be56eKenneth Graunke};
319