<p><br>
On Jan 20, 2012 9:07 PM, &quot;Jonathan Coome&quot; &lt;<a href="mailto:jcoome@fastmail.co.uk">jcoome@fastmail.co.uk</a>&gt; wrote:<br>
&gt;<br>
&gt; On 19/01/2012 23:48, Yuanhan Liu wrote:<br>
&gt; &gt; When rendering to FBO, rendering is inverted. At the same time, we would<br>
&gt; &gt; also make sure the point sprite origin is inverted. Or, we will get an<br>
&gt; &gt; inverted result correspoinding to rendering to the default winsys FBO.<br>
&gt; &gt;<br>
&gt; &gt; Bugzilla: <a href="https://bugs.freedesktop.org/show_bug.cgi?id=44613">https://bugs.freedesktop.org/show_bug.cgi?id=44613</a><br>
&gt; &gt;<br>
&gt; &gt; NOTE: This is a candidate for stable release branches.<br>
&gt; &gt;<br>
&gt; &gt; v2: add the simliar logic to ivb, too (comments from Ian)<br>
&gt; &gt;     simplify the logic operation (comments from Brian)<br>
&gt; &gt;<br>
&gt; &gt; v3: pick a better comment from Eric<br>
&gt; &gt;     use != for the logic instead of ^ (comments from Ian)<br>
&gt; &gt;<br>
&gt; &gt; Signed-off-by: Yuanhan Liu &lt;<a href="mailto:yuanhan.liu@linux.intel.com">yuanhan.liu@linux.intel.com</a>&gt;<br>
&gt; &gt; ---<br>
&gt; &gt;  src/mesa/drivers/dri/i965/brw_defines.h   |    1 +<br>
&gt; &gt;  src/mesa/drivers/dri/i965/gen6_sf_state.c |   13 +++++++++++--<br>
&gt; &gt;  src/mesa/drivers/dri/i965/gen7_sf_state.c |   18 +++++++++++++++---<br>
&gt; &gt;  3 files changed, 27 insertions(+), 5 deletions(-)<br>
&gt; &gt;<br>
&gt; &gt; diff --git a/src/mesa/drivers/dri/i965/brw_defines.h b/src/mesa/drivers/dri/i965/brw_defines.h<br>
&gt; &gt; index 4d90a99..029be87 100644<br>
&gt; &gt; --- a/src/mesa/drivers/dri/i965/brw_defines.h<br>
&gt; &gt; +++ b/src/mesa/drivers/dri/i965/brw_defines.h<br>
&gt; &gt; @@ -1128,6 +1128,7 @@ enum brw_message_target {<br>
&gt; &gt;  /* DW1 (for gen6) */<br>
&gt; &gt;  # define GEN6_SF_NUM_OUTPUTS_SHIFT                   22<br>
&gt; &gt;  # define GEN6_SF_SWIZZLE_ENABLE                              (1 &lt;&lt; 21)<br>
&gt; &gt; +# define GEN6_SF_POINT_SPRITE_UPPERLEFT                      (0 &lt;&lt; 20)<br>
&gt; &gt;  # define GEN6_SF_POINT_SPRITE_LOWERLEFT                      (1 &lt;&lt; 20)<br>
&gt; &gt;  # define GEN6_SF_URB_ENTRY_READ_LENGTH_SHIFT         11<br>
&gt; &gt;  # define GEN6_SF_URB_ENTRY_READ_OFFSET_SHIFT         4<br>
&gt; &gt; diff --git a/src/mesa/drivers/dri/i965/gen6_sf_state.c b/src/mesa/drivers/dri/i965/gen6_sf_state.c<br>
&gt; &gt; index 548c5a3..163b54c 100644<br>
&gt; &gt; --- a/src/mesa/drivers/dri/i965/gen6_sf_state.c<br>
&gt; &gt; +++ b/src/mesa/drivers/dri/i965/gen6_sf_state.c<br>
&gt; &gt; @@ -129,6 +129,7 @@ upload_sf_state(struct brw_context *brw)<br>
&gt; &gt;     float point_size;<br>
&gt; &gt;     uint16_t attr_overrides[FRAG_ATTRIB_MAX];<br>
&gt; &gt;     bool userclip_active;<br>
&gt; &gt; +   uint32_t point_sprite_origin;<br>
&gt; &gt;<br>
&gt; &gt;     /* _NEW_TRANSFORM */<br>
&gt; &gt;     userclip_active = (ctx-&gt;Transform.ClipPlanesEnabled != 0);<br>
&gt; &gt; @@ -258,8 +259,16 @@ upload_sf_state(struct brw_context *brw)<br>
&gt; &gt;     /* Clamp to the hardware limits and convert to fixed point */<br>
&gt; &gt;     dw4 |= U_FIXED(CLAMP(point_size, 0.125, 255.875), 3);<br>
&gt; &gt;<br>
&gt; &gt; -   if (ctx-&gt;Point.SpriteOrigin == GL_LOWER_LEFT)<br>
&gt; &gt; -      dw1 |= GEN6_SF_POINT_SPRITE_LOWERLEFT;<br>
&gt; &gt; +   /*<br>
&gt; &gt; +    * Window coordinates in an FBO are inverted, which means point<br>
&gt; &gt; +    * sprite origin must be inverted, too.<br>
&gt; &gt; +    */<br>
&gt; &gt; +   if ((ctx-&gt;Point.SpriteOrigin == GL_LOWER_LEFT) != render_to_fbo) {<br>
&gt; &gt; +      point_sprite_origin = GEN6_SF_POINT_SPRITE_LOWERLEFT;<br>
&gt; &gt; +   } else {<br>
&gt; &gt; +      point_sprite_origin = GEN6_SF_POINT_SPRITE_UPPERLEFT;<br>
&gt; &gt; +   }<br>
&gt; &gt; +   dw1 |= point_sprite_origin;<br>
&gt; &gt;<br>
&gt; &gt;     /* _NEW_LIGHT */<br>
&gt; &gt;     if (ctx-&gt;Light.ProvokingVertex != GL_FIRST_VERTEX_CONVENTION) {<br>
&gt; &gt; diff --git a/src/mesa/drivers/dri/i965/gen7_sf_state.c b/src/mesa/drivers/dri/i965/gen7_sf_state.c<br>
&gt; &gt; index 7691cb2..da7ef81 100644<br>
&gt; &gt; --- a/src/mesa/drivers/dri/i965/gen7_sf_state.c<br>
&gt; &gt; +++ b/src/mesa/drivers/dri/i965/gen7_sf_state.c<br>
&gt; &gt; @@ -48,6 +48,9 @@ upload_sbe_state(struct brw_context *brw)<br>
&gt; &gt;     int urb_entry_read_offset = 1;<br>
&gt; &gt;     bool userclip_active = (ctx-&gt;Transform.ClipPlanesEnabled != 0);<br>
&gt; &gt;     uint16_t attr_overrides[FRAG_ATTRIB_MAX];<br>
&gt; &gt; +   /* _NEW_BUFFERS */<br>
&gt; &gt; +   bool render_to_fbo = ctx-&gt;DrawBuffer-&gt;Name != 0;<br>
&gt; &gt; +   uint32_t point_sprite_origin;<br>
&gt; &gt;<br>
&gt; &gt;     brw_compute_vue_map(&amp;vue_map, intel, userclip_active, vs_outputs_written);<br>
&gt; &gt;     urb_entry_read_length = (vue_map.num_slots + 1)/2 - urb_entry_read_offset;<br>
&gt; &gt; @@ -65,9 +68,18 @@ upload_sbe_state(struct brw_context *brw)<br>
&gt; &gt;        urb_entry_read_length &lt;&lt; GEN7_SBE_URB_ENTRY_READ_LENGTH_SHIFT |<br>
&gt; &gt;        urb_entry_read_offset &lt;&lt; GEN7_SBE_URB_ENTRY_READ_OFFSET_SHIFT;<br>
&gt; &gt;<br>
&gt; &gt; -   /* _NEW_POINT */<br>
&gt; &gt; -   if (ctx-&gt;Point.SpriteOrigin == GL_LOWER_LEFT)<br>
&gt; &gt; -      dw1 |= GEN6_SF_POINT_SPRITE_LOWERLEFT;<br>
&gt; &gt; +   /* _NEW_POINT<br>
&gt; &gt; +    *<br>
&gt; &gt; +    * Window coordinates in an FBO are inverted, which means point<br>
&gt; &gt; +    * sprite origin must be inverted.<br>
&gt; &gt; +    */<br>
&gt; &gt; +   if ((ctx-&gt;Point.SpriteOrigin == GL_LOWER_LEFT) != render_to_fbo) {<br>
&gt; &gt; +      point_sprite_origin = GEN6_SF_POINT_SPRITE_LOWERLEFT;<br>
&gt; &gt; +   } else {<br>
&gt; &gt; +      point_sprite_origin = GEN6_SF_POINT_SPRITE_UPPERLEFT;<br>
&gt; &gt; +   }<br>
&gt; &gt; +   dw1 |= point_sprite_origin;<br>
&gt; &gt; +<br>
&gt; &gt;<br>
&gt; &gt;     dw10 = 0;<br>
&gt; &gt;     dw11 = 0;<br>
&gt;<br>
&gt; Is there any need for GEN6_SF_POINT_SPRITE_UPPERLEFT?</p>
<p>For making the code clear and easy reading, I&#39;d like to add it.</p>
<p>&gt; It&#39;s basically 0,<br>
&gt; so the | operation with dw1 won&#39;t have any effect, and you could remove<br>
&gt; the else clauses.<br>
&gt; And if you wanted to clear the bit, </p>
<p>No, its not supposed to be a clear operation, but an _or_ operation. And the operand happens to be zero. Just image we want to set a bit, but not set 0. So, the logic of your following code doesn&#39;t make sense to me.</p>

<p>Thanks.</p>
<p>--<br>
Yuanhan Liu<br>
(Sent by my phone, please forgive for the poor format)</p>
<p>&gt;I think you&#39;d need<br>
&gt; to do something like this instead:<br>
&gt;<br>
&gt; if ((ctx-&gt;Point.SpriteOrigin == GL_LOWER_LEFT) != render_to_fbo) {<br>
&gt;        dw1 |= GEN6_SF_POINT_SPRITE_LOWERLEFT;<br>
&gt; } else {<br>
&gt;        dw1 &amp;= ~GEN6_SF_POINT_SPRITE_LOWERLEFT;<br>
&gt; }<br>
&gt;<br>
&gt; -Jonathan<br>
&gt; _______________________________________________<br>
&gt; mesa-dev mailing list<br>
&gt; <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
&gt; <a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</p>