gen7_sf_state.c revision 4433b0302d0aa9dc61002e8bb4fd1b752b0be338
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;
379660e3b788227de4aa15c42c5bbd48b85ad46d24Paul Berry   uint32_t urb_entry_read_length;
387d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* BRW_NEW_FRAGMENT_PROGRAM */
39c163072197b56e76b656cc472bbe6df650cf11baPaul Berry   uint32_t num_outputs = _mesa_bitcount_64(brw->fragment_program->Base.InputsRead);
405aa96286e7e1a5380673eb75e8653616b48751fdPaul Berry   /* _NEW_LIGHT */
415aa96286e7e1a5380673eb75e8653616b48751fdPaul Berry   bool shade_model_flat = ctx->Light.ShadeModel == GL_FLAT;
427d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   uint32_t dw1, dw10, dw11;
437d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   int i;
445edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke   int attr = 0, input_index = 0;
452a6d43204024bc47df9bf5f7803d62d4d9580ab5Paul Berry   int urb_entry_read_offset = 1;
465edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke   uint16_t attr_overrides[FRAG_ATTRIB_MAX];
47eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu   /* _NEW_BUFFERS */
484433b0302d0aa9dc61002e8bb4fd1b752b0be338Brian Paul   bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer);
49eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu   uint32_t point_sprite_origin;
507d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
519f3d3216cf25d8ffed4d72fbce6feacbc2990e4bEric Anholt   /* CACHE_NEW_VS_PROG */
52f0cecd43d6b6d3f5def3fd43b9c95baaf3be9b16Eric Anholt   urb_entry_read_length = ((brw->vs.prog_data->vue_map.num_slots + 1) / 2 -
53f0cecd43d6b6d3f5def3fd43b9c95baaf3be9b16Eric Anholt			    urb_entry_read_offset);
549660e3b788227de4aa15c42c5bbd48b85ad46d24Paul Berry   if (urb_entry_read_length == 0) {
559660e3b788227de4aa15c42c5bbd48b85ad46d24Paul Berry      /* Setting the URB entry read length to 0 causes undefined behavior, so
569660e3b788227de4aa15c42c5bbd48b85ad46d24Paul Berry       * if we have no URB data to read, set it to 1.
579660e3b788227de4aa15c42c5bbd48b85ad46d24Paul Berry       */
589660e3b788227de4aa15c42c5bbd48b85ad46d24Paul Berry      urb_entry_read_length = 1;
599660e3b788227de4aa15c42c5bbd48b85ad46d24Paul Berry   }
609660e3b788227de4aa15c42c5bbd48b85ad46d24Paul Berry
617d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* FINISHME: Attribute Swizzle Control Mode? */
627d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   dw1 =
637d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      GEN7_SBE_SWIZZLE_ENABLE |
647d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      num_outputs << GEN7_SBE_NUM_OUTPUTS_SHIFT |
659660e3b788227de4aa15c42c5bbd48b85ad46d24Paul Berry      urb_entry_read_length << GEN7_SBE_URB_ENTRY_READ_LENGTH_SHIFT |
662d909f431c67d0c8c5075dc40f2901076c5bc48bPaul Berry      urb_entry_read_offset << GEN7_SBE_URB_ENTRY_READ_OFFSET_SHIFT;
677d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
68eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu   /* _NEW_POINT
69eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu    *
70eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu    * Window coordinates in an FBO are inverted, which means point
71eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu    * sprite origin must be inverted.
72eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu    */
73eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu   if ((ctx->Point.SpriteOrigin == GL_LOWER_LEFT) != render_to_fbo) {
74eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu      point_sprite_origin = GEN6_SF_POINT_SPRITE_LOWERLEFT;
75eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu   } else {
76eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu      point_sprite_origin = GEN6_SF_POINT_SPRITE_UPPERLEFT;
77eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu   }
78eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu   dw1 |= point_sprite_origin;
79eaf360e5bffc5630789367020252cd12fe586177Yuanhan Liu
807d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
817d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   dw10 = 0;
827d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   dw11 = 0;
837d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
845edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke   /* Create the mapping from the FS inputs we produce to the VS outputs
855edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke    * they source from.
865edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke    */
875edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke   for (; attr < FRAG_ATTRIB_MAX; attr++) {
885aa96286e7e1a5380673eb75e8653616b48751fdPaul Berry      enum glsl_interp_qualifier interp_qualifier =
895aa96286e7e1a5380673eb75e8653616b48751fdPaul Berry         brw->fragment_program->InterpQualifier[attr];
905aa96286e7e1a5380673eb75e8653616b48751fdPaul Berry      bool is_gl_Color = attr == FRAG_ATTRIB_COL0 || attr == FRAG_ATTRIB_COL1;
915aa96286e7e1a5380673eb75e8653616b48751fdPaul Berry
925edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke      if (!(brw->fragment_program->Base.InputsRead & BITFIELD64_BIT(attr)))
935edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke	 continue;
945edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke
95147d0102952b7c0b16906c08da2ae447ec68185aKenneth Graunke      if (ctx->Point.PointSprite &&
96147d0102952b7c0b16906c08da2ae447ec68185aKenneth Graunke	  attr >= FRAG_ATTRIB_TEX0 && attr <= FRAG_ATTRIB_TEX7 &&
97147d0102952b7c0b16906c08da2ae447ec68185aKenneth Graunke	  ctx->Point.CoordReplace[attr - FRAG_ATTRIB_TEX0]) {
98147d0102952b7c0b16906c08da2ae447ec68185aKenneth Graunke	 dw10 |= (1 << input_index);
99147d0102952b7c0b16906c08da2ae447ec68185aKenneth Graunke      }
100147d0102952b7c0b16906c08da2ae447ec68185aKenneth Graunke
101186e37c75454965e1a58298e878a9585f4866749Kenneth Graunke      if (attr == FRAG_ATTRIB_PNTC)
102186e37c75454965e1a58298e878a9585f4866749Kenneth Graunke	 dw10 |= (1 << input_index);
103186e37c75454965e1a58298e878a9585f4866749Kenneth Graunke
104cd6b8421cac2df89dc6365ce368232e461caffcdYuanhan Liu      /* flat shading */
1055aa96286e7e1a5380673eb75e8653616b48751fdPaul Berry      if (interp_qualifier == INTERP_QUALIFIER_FLAT ||
1065aa96286e7e1a5380673eb75e8653616b48751fdPaul Berry          (shade_model_flat && is_gl_Color &&
1075aa96286e7e1a5380673eb75e8653616b48751fdPaul Berry           interp_qualifier == INTERP_QUALIFIER_NONE))
1085aa96286e7e1a5380673eb75e8653616b48751fdPaul Berry         dw11 |= (1 << input_index);
109cd6b8421cac2df89dc6365ce368232e461caffcdYuanhan Liu
1105edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke      /* The hardware can only do the overrides on 16 overrides at a
1115edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke       * time, and the other up to 16 have to be lined up so that the
1125edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke       * input index = the output index.  We'll need to do some
1135edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke       * tweaking to make sure that's the case.
1145edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke       */
1155edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke      assert(input_index < 16 || attr == input_index);
1165edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke
117f0cecd43d6b6d3f5def3fd43b9c95baaf3be9b16Eric Anholt      /* CACHE_NEW_VS_PROG | _NEW_LIGHT | _NEW_PROGRAM */
1182d909f431c67d0c8c5075dc40f2901076c5bc48bPaul Berry      attr_overrides[input_index++] =
119f0cecd43d6b6d3f5def3fd43b9c95baaf3be9b16Eric Anholt         get_attr_override(&brw->vs.prog_data->vue_map,
120f0cecd43d6b6d3f5def3fd43b9c95baaf3be9b16Eric Anholt			   urb_entry_read_offset, attr,
121447c488d77ea9710e0ffc238953917189d3000c7Eric Anholt                           ctx->VertexProgram._TwoSideEnabled);
1225edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke   }
1235edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke
124a48cc138a8b7c55f8d12796677e081c2b2085f48Kenneth Graunke   for (; input_index < FRAG_ATTRIB_MAX; input_index++)
125a48cc138a8b7c55f8d12796677e081c2b2085f48Kenneth Graunke      attr_overrides[input_index] = 0;
1265edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke
1277d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   BEGIN_BATCH(14);
1287d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH(_3DSTATE_SBE << 16 | (14 - 2));
1297d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH(dw1);
1307d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1317d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* Output dwords 2 through 9 */
1327d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   for (i = 0; i < 8; i++) {
1335edb3ddf4191b31b4a4e43a85fe1bfbd62a8cb17Kenneth Graunke      OUT_BATCH(attr_overrides[i * 2] | attr_overrides[i * 2 + 1] << 16);
1347d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   }
1357d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1367d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH(dw10); /* point sprite texcoord bitmask */
1377d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH(dw11); /* constant interp bitmask */
1387d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH(0); /* wrapshortest enables 0-7 */
1397d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH(0); /* wrapshortest enables 8-15 */
1407d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   ADVANCE_BATCH();
1417d608d0c331c101088273655708965fb9f1be56eKenneth Graunke}
1427d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1437d608d0c331c101088273655708965fb9f1be56eKenneth Graunkeconst struct brw_tracked_state gen7_sbe_state = {
1447d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   .dirty = {
1457d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      .mesa  = (_NEW_LIGHT |
1467d608d0c331c101088273655708965fb9f1be56eKenneth Graunke		_NEW_POINT |
1479f3d3216cf25d8ffed4d72fbce6feacbc2990e4bEric Anholt		_NEW_PROGRAM),
1487d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      .brw   = (BRW_NEW_CONTEXT |
1497b36c68ba6899c7f30fd56b7ef07a78b027771acChad Versace		BRW_NEW_FRAGMENT_PROGRAM),
1507d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      .cache = CACHE_NEW_VS_PROG
1517d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   },
1527d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   .emit = upload_sbe_state,
1537d608d0c331c101088273655708965fb9f1be56eKenneth Graunke};
1547d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1557d608d0c331c101088273655708965fb9f1be56eKenneth Graunkestatic void
1567d608d0c331c101088273655708965fb9f1be56eKenneth Graunkeupload_sf_state(struct brw_context *brw)
1577d608d0c331c101088273655708965fb9f1be56eKenneth Graunke{
1587d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   struct intel_context *intel = &brw->intel;
1597d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   struct gl_context *ctx = &intel->ctx;
1607d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   uint32_t dw1, dw2, dw3;
1617d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   float point_size;
1627d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* _NEW_BUFFERS */
1634433b0302d0aa9dc61002e8bb4fd1b752b0be338Brian Paul   bool render_to_fbo = _mesa_is_user_fbo(brw->intel.ctx.DrawBuffer);
1647d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1657b36c68ba6899c7f30fd56b7ef07a78b027771acChad Versace   dw1 = GEN6_SF_STATISTICS_ENABLE |
1667b36c68ba6899c7f30fd56b7ef07a78b027771acChad Versace         GEN6_SF_VIEWPORT_TRANSFORM_ENABLE;
1677d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
168a98dd64af750fb6dae54b2dc02e0c5a3711156afEric Anholt   /* _NEW_BUFFERS */
169d84a180417d1eabd680554970f1eaaa93abcd41eEric Anholt   dw1 |= (brw_depthbuffer_format(brw) << GEN7_SF_DEPTH_BUFFER_SURFACE_FORMAT_SHIFT);
1708c8985bdd714f43a96ce922a7c0284d50aec3d1aKenneth Graunke
1717d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* _NEW_POLYGON */
1727d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   if ((ctx->Polygon.FrontFace == GL_CCW) ^ render_to_fbo)
1737d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      dw1 |= GEN6_SF_WINDING_CCW;
1747d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1757d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   if (ctx->Polygon.OffsetFill)
1767d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       dw1 |= GEN6_SF_GLOBAL_DEPTH_OFFSET_SOLID;
1777d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1787d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   if (ctx->Polygon.OffsetLine)
1797d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       dw1 |= GEN6_SF_GLOBAL_DEPTH_OFFSET_WIREFRAME;
1807d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1817d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   if (ctx->Polygon.OffsetPoint)
1827d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       dw1 |= GEN6_SF_GLOBAL_DEPTH_OFFSET_POINT;
1837d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1847d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   switch (ctx->Polygon.FrontMode) {
1857d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   case GL_FILL:
1867d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       dw1 |= GEN6_SF_FRONT_SOLID;
1877d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       break;
1887d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1897d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   case GL_LINE:
1907d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       dw1 |= GEN6_SF_FRONT_WIREFRAME;
1917d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       break;
1927d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1937d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   case GL_POINT:
1947d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       dw1 |= GEN6_SF_FRONT_POINT;
1957d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       break;
1967d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
1977d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   default:
1987d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       assert(0);
1997d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       break;
2007d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   }
2017d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2027d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   switch (ctx->Polygon.BackMode) {
2037d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   case GL_FILL:
2047d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       dw1 |= GEN6_SF_BACK_SOLID;
2057d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       break;
2067d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2077d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   case GL_LINE:
2087d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       dw1 |= GEN6_SF_BACK_WIREFRAME;
2097d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       break;
2107d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2117d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   case GL_POINT:
2127d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       dw1 |= GEN6_SF_BACK_POINT;
2137d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       break;
2147d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2157d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   default:
2167d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       assert(0);
2177d608d0c331c101088273655708965fb9f1be56eKenneth Graunke       break;
2187d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   }
2197d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2207d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   dw2 = 0;
2217d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2227d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   if (ctx->Polygon.CullFlag) {
2237d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      switch (ctx->Polygon.CullFaceMode) {
2247d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      case GL_FRONT:
2257d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 dw2 |= GEN6_SF_CULL_FRONT;
2267d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 break;
2277d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      case GL_BACK:
2287d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 dw2 |= GEN6_SF_CULL_BACK;
2297d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 break;
2307d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      case GL_FRONT_AND_BACK:
2317d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 dw2 |= GEN6_SF_CULL_BOTH;
2327d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 break;
2337d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      default:
2347d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 assert(0);
2357d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 break;
2367d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      }
2377d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   } else {
2387d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      dw2 |= GEN6_SF_CULL_NONE;
2397d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   }
2407d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2417d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* _NEW_SCISSOR */
2427d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   if (ctx->Scissor.Enabled)
2437d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      dw2 |= GEN6_SF_SCISSOR_ENABLE;
2447d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2457d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* _NEW_LINE */
2467d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   dw2 |= U_FIXED(CLAMP(ctx->Line.Width, 0.0, 7.99), 7) <<
2477d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      GEN6_SF_LINE_WIDTH_SHIFT;
2487d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   if (ctx->Line.SmoothFlag) {
2497d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      dw2 |= GEN6_SF_LINE_AA_ENABLE;
2507d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      dw2 |= GEN6_SF_LINE_AA_MODE_TRUE;
2517d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      dw2 |= GEN6_SF_LINE_END_CAP_WIDTH_1_0;
2527d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   }
253b4410ac3944ee30bbf5455e3e649b73f559a7d38Kenneth Graunke   if (ctx->Line.StippleFlag && intel->is_haswell) {
254b4410ac3944ee30bbf5455e3e649b73f559a7d38Kenneth Graunke      dw2 |= HSW_SF_LINE_STIPPLE_ENABLE;
255b4410ac3944ee30bbf5455e3e649b73f559a7d38Kenneth Graunke   }
2567d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2577d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* FINISHME: Last Pixel Enable?  Vertex Sub Pixel Precision Select?
2587d608d0c331c101088273655708965fb9f1be56eKenneth Graunke    * FINISHME: AA Line Distance Mode?
2597d608d0c331c101088273655708965fb9f1be56eKenneth Graunke    */
2607d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2617d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   dw3 = 0;
2627d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
263ef034f109427f1a8d31dbe10beed825881130f6bKenneth Graunke   /* _NEW_PROGRAM | _NEW_POINT */
2647d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   if (!(ctx->VertexProgram.PointSizeEnabled || ctx->Point._Attenuated))
2657d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      dw3 |= GEN6_SF_USE_STATE_POINT_WIDTH;
2667d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2677d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* Clamp to ARB_point_parameters user limits */
2687d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   point_size = CLAMP(ctx->Point.Size, ctx->Point.MinSize, ctx->Point.MaxSize);
2697d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2707d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* Clamp to the hardware limits and convert to fixed point */
2717d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   dw3 |= U_FIXED(CLAMP(point_size, 0.125, 255.875), 3);
2727d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2737d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   /* _NEW_LIGHT */
2747d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   if (ctx->Light.ProvokingVertex != GL_FIRST_VERTEX_CONVENTION) {
2757d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      dw3 |=
2767d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 (2 << GEN6_SF_TRI_PROVOKE_SHIFT) |
2777d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 (2 << GEN6_SF_TRIFAN_PROVOKE_SHIFT) |
2787d608d0c331c101088273655708965fb9f1be56eKenneth Graunke	 (1 << GEN6_SF_LINE_PROVOKE_SHIFT);
2797d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   } else {
2807d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      dw3 |= (1 << GEN6_SF_TRIFAN_PROVOKE_SHIFT);
2817d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   }
2827d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2837d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   BEGIN_BATCH(7);
2847d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH(_3DSTATE_SF << 16 | (7 - 2));
2857d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH(dw1);
2867d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH(dw2);
2877d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH(dw3);
2887d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH_F(ctx->Polygon.OffsetUnits * 2); /* constant.  copied from gen4 */
2897d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH_F(ctx->Polygon.OffsetFactor); /* scale */
2907d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   OUT_BATCH_F(0.0); /* XXX: global depth offset clamp */
2917d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   ADVANCE_BATCH();
2927d608d0c331c101088273655708965fb9f1be56eKenneth Graunke}
2937d608d0c331c101088273655708965fb9f1be56eKenneth Graunke
2947d608d0c331c101088273655708965fb9f1be56eKenneth Graunkeconst struct brw_tracked_state gen7_sf_state = {
2957d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   .dirty = {
2967d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      .mesa  = (_NEW_LIGHT |
297447c488d77ea9710e0ffc238953917189d3000c7Eric Anholt		_NEW_PROGRAM |
2987d608d0c331c101088273655708965fb9f1be56eKenneth Graunke		_NEW_POLYGON |
2997d608d0c331c101088273655708965fb9f1be56eKenneth Graunke		_NEW_LINE |
3007d608d0c331c101088273655708965fb9f1be56eKenneth Graunke		_NEW_SCISSOR |
3017d608d0c331c101088273655708965fb9f1be56eKenneth Graunke		_NEW_BUFFERS |
3027d608d0c331c101088273655708965fb9f1be56eKenneth Graunke		_NEW_POINT),
3037b36c68ba6899c7f30fd56b7ef07a78b027771acChad Versace      .brw   = BRW_NEW_CONTEXT,
3047d608d0c331c101088273655708965fb9f1be56eKenneth Graunke      .cache = CACHE_NEW_VS_PROG
3057d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   },
3067d608d0c331c101088273655708965fb9f1be56eKenneth Graunke   .emit = upload_sf_state,
3077d608d0c331c101088273655708965fb9f1be56eKenneth Graunke};
308