<div dir="ltr">On 16 February 2013 13:52, Kenneth Graunke <span dir="ltr"><<a href="mailto:kenneth@whitecape.org" target="_blank">kenneth@whitecape.org</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">On 02/16/2013 07:29 AM, Paul Berry wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
 From the Ivy Bridge PRM, p268 (3DSTATE_SBE), in the description of<br>
"Point Sprite Texture Coordinate Enable":<br>
<br>
     "This field must be programmed to 0 when non-point primitives are<br>
     rendered."<br>
<br>
A similar admonishment exists in the Sandy Bridge PRM.<br>
<br>
Although I'm not aware of any known bugs due to us ignoring this,<br>
defying the hardware docs is generally unwise.<br>
---<br>
  src/mesa/drivers/dri/i965/<u></u>gen6_sf_state.c | 9 ++++++---<br>
  src/mesa/drivers/dri/i965/<u></u>gen7_sf_state.c | 9 ++++++---<br>
  2 files changed, 12 insertions(+), 6 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/<u></u>gen6_sf_state.c b/src/mesa/drivers/dri/i965/<u></u>gen6_sf_state.c<br>
index 7071acc..d88c49a 100644<br>
--- a/src/mesa/drivers/dri/i965/<u></u>gen6_sf_state.c<br>
+++ b/src/mesa/drivers/dri/i965/<u></u>gen6_sf_state.c<br>
@@ -127,6 +127,8 @@ upload_sf_state(struct brw_context *brw)<br>
     /* _NEW_BUFFER */<br>
     bool render_to_fbo = _mesa_is_user_fbo(brw->intel.<u></u>ctx.DrawBuffer);<br>
     bool multisampled_fbo = ctx->DrawBuffer->Visual.<u></u>samples > 1;<br>
+   /* BRW_NEW_REDUCED_PRIMITIVE */<br>
+   bool is_point_primitive = intel->reduced_primitive == GL_POINTS;<br>
</blockquote>
<br></div>
NAK.  intel->reduced_primitive is only set in brw_set_prim(), which is never called on Gen6+.  (gen6_set_prim() gets called instead.)<br></blockquote><div><br></div><div>Oops, you're right.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<br>
I believe you want brw->primitive and BRW_NEW_PRIMITIVE instead.</blockquote><div><br></div><div>The disadvantage of using brw->primitive and BRW_NEW_PRIMITIVE is that it means this packet will get re-emitted whenever the primitive type changes.  If reduced_primitive were available, then this packet would only be re-emitted when switching between triangle-like, line-like, and point primitives (which probably happens a lot less frequently).<br>
<br></div><div>What would you think if instead I ported the reduced_primitive code to gen6+?  (It's only a couple of lines).<br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
     int attr = 0, input_index = 0;<br>
     int urb_entry_read_offset = 1;<br>
@@ -280,13 +282,13 @@ upload_sf_state(struct brw_context *brw)<br>
         continue;<br>
<br>
        /* _NEW_POINT */<br>
-      if (ctx->Point.PointSprite &&<br>
+      if (is_point_primitive && ctx->Point.PointSprite &&<br>
          (attr >= FRAG_ATTRIB_TEX0 && attr <= FRAG_ATTRIB_TEX7) &&<br>
          ctx->Point.CoordReplace[attr - FRAG_ATTRIB_TEX0]) {<br>
         dw16 |= (1 << input_index);<br>
        }<br>
<br>
-      if (attr == FRAG_ATTRIB_PNTC)<br>
+      if (is_point_primitive && attr == FRAG_ATTRIB_PNTC)<br>
         dw16 |= (1 << input_index);<br>
<br>
        /* flat shading */<br>
@@ -360,7 +362,8 @@ const struct brw_tracked_state gen6_sf_state = {<br>
                _NEW_POINT |<br>
                  _NEW_MULTISAMPLE),<br>
        .brw   = (BRW_NEW_CONTEXT |<br>
-               BRW_NEW_FRAGMENT_PROGRAM),<br>
+               BRW_NEW_FRAGMENT_PROGRAM |<br>
+                BRW_NEW_REDUCED_PRIMITIVE),<br>
        .cache = CACHE_NEW_VS_PROG<br>
     },<br>
     .emit = upload_sf_state,<br>
diff --git a/src/mesa/drivers/dri/i965/<u></u>gen7_sf_state.c b/src/mesa/drivers/dri/i965/<u></u>gen7_sf_state.c<br>
index 9171eff..0f6252b 100644<br>
--- a/src/mesa/drivers/dri/i965/<u></u>gen7_sf_state.c<br>
+++ b/src/mesa/drivers/dri/i965/<u></u>gen7_sf_state.c<br>
@@ -46,6 +46,8 @@ upload_sbe_state(struct brw_context *brw)<br>
     /* _NEW_BUFFERS */<br>
     bool render_to_fbo = _mesa_is_user_fbo(ctx-><u></u>DrawBuffer);<br>
     uint32_t point_sprite_origin;<br>
+   /* BRW_NEW_REDUCED_PRIMITIVE */<br>
+   bool is_point_primitive = intel->reduced_primitive == GL_POINTS;<br>
<br>
     /* FINISHME: Attribute Swizzle Control Mode? */<br>
     dw1 = GEN7_SBE_SWIZZLE_ENABLE | num_outputs << GEN7_SBE_NUM_OUTPUTS_SHIFT;<br>
@@ -78,13 +80,13 @@ upload_sbe_state(struct brw_context *brw)<br>
        if (!(brw->fragment_program-><u></u>Base.InputsRead & BITFIELD64_BIT(attr)))<br>
         continue;<br>
<br>
-      if (ctx->Point.PointSprite &&<br>
+      if (is_point_primitive && ctx->Point.PointSprite &&<br>
          attr >= FRAG_ATTRIB_TEX0 && attr <= FRAG_ATTRIB_TEX7 &&<br>
          ctx->Point.CoordReplace[attr - FRAG_ATTRIB_TEX0]) {<br>
         dw10 |= (1 << input_index);<br>
        }<br>
<br>
-      if (attr == FRAG_ATTRIB_PNTC)<br>
+      if (is_point_primitive && attr == FRAG_ATTRIB_PNTC)<br>
         dw10 |= (1 << input_index);<br>
<br>
        /* flat shading */<br>
@@ -149,7 +151,8 @@ const struct brw_tracked_state gen7_sbe_state = {<br>
                _NEW_POINT |<br>
                _NEW_PROGRAM),<br>
        .brw   = (BRW_NEW_CONTEXT |<br>
-               BRW_NEW_FRAGMENT_PROGRAM),<br>
+               BRW_NEW_FRAGMENT_PROGRAM |<br>
+                BRW_NEW_REDUCED_PRIMITIVE),<br>
        .cache = CACHE_NEW_VS_PROG<br>
     },<br>
     .emit = upload_sbe_state,<br>
<br>
</blockquote>
<br>
</div></div></blockquote></div><br></div></div>