On 19 December 2011 19:07, Marek Olšák <span dir="ltr">&lt;<a href="mailto:maraeo@gmail.com" target="_blank">maraeo@gmail.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<div><div>On Thu, Dec 15, 2011 at 7:21 PM, Paul Berry &lt;<a href="mailto:stereotype441@gmail.com" target="_blank">stereotype441@gmail.com</a>&gt; wrote:<br>
&gt; On 15 December 2011 08:02, Eric Anholt &lt;<a href="mailto:eric@anholt.net" target="_blank">eric@anholt.net</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; On Thu, 15 Dec 2011 00:00:49 +0100, Marek Olšák &lt;<a href="mailto:maraeo@gmail.com" target="_blank">maraeo@gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt; On Wed, Dec 14, 2011 at 11:25 PM, Paul Berry &lt;<a href="mailto:stereotype441@gmail.com" target="_blank">stereotype441@gmail.com</a>&gt;<br>
&gt;&gt; &gt; wrote:<br>
&gt;&gt; &gt; &gt; (c) Do nothing, and rely on programmers to remember that RasterDiscard<br>
&gt;&gt; &gt; &gt; is an<br>
&gt;&gt; &gt; &gt; exception to the usual correspondence between dirty bits and<br>
&gt;&gt; &gt; &gt; substructures<br>
&gt;&gt; &gt; &gt; of gl_context.<br>
&gt;&gt; &gt; &gt;<br>
&gt;&gt; &gt; &gt; I&#39;m really not comfortable with (c) because of the risk of future<br>
&gt;&gt; &gt; &gt; bugs.  I<br>
&gt;&gt; &gt; &gt; suppose I could be talked into (b) if there&#39;s popular support for it,<br>
&gt;&gt; &gt; &gt; but<br>
&gt;&gt; &gt; &gt; it&#39;s not my favourite, because as I said earlier, I think there are<br>
&gt;&gt; &gt; &gt; actually<br>
&gt;&gt; &gt; &gt; a lot of good reasons to think of rasterizer discard as related to<br>
&gt;&gt; &gt; &gt; transform<br>
&gt;&gt; &gt; &gt; feedback.  My preference is to do (a).<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; (d) Rework the _NEW_* flags such that they roughly match hardware<br>
&gt;&gt; &gt; state groups, not OpenGL state groups. Direct3D 11 and Gallium are two<br>
&gt;&gt; &gt; examples of how it could be done.<br>
&gt;&gt;<br>
&gt;&gt; The problem is that everyone disagrees on what &quot;hardware state group&quot; a<br>
&gt;&gt; piece of state is in.  On i965, rasterizer discard is really in the<br>
&gt;&gt; transform feedback state -- the SOL (transform feedback) unit on gen7,<br>
&gt;&gt; and the GS on gen6.<br>
&gt;<br>
&gt;<br>
&gt; I have been thinking about this more this morning, and I have an idea for<br>
&gt; how to accomplish (d) that I think would address this problem.  It&#39;s not a<br>
&gt; trivial change, but it&#39;s something we could implement incrementally, so we<br>
&gt; apply it to rasterizer discard now, and over time extend it to cover other<br>
&gt; pieces of state.  Here&#39;s the idea:<br>
&gt;<br>
&gt; The key problem is that there are so many distinct pieces of state that we<br>
&gt; could never possibly assign a separate bit to each one--we would run out of<br>
&gt; space in the bitfield.  So instead of having core Mesa decide how they are<br>
&gt; grouped (and, inevitably, wind up grouping them in a way that doesn&#39;t work<br>
&gt; well for some drivers), let each driver decide how they are grouped.  The<br>
&gt; drivers communicate this grouping to core Mesa by populating a new data<br>
&gt; structure (at initialization time) called ctx-&gt;StateFlags.  ctx-&gt;StateFlags<br>
&gt; has an entry for each distinct piece of state, which tells which bits in<br>
&gt; ctx-&gt;NewState should be set when that state changes.<br>
&gt;<br>
&gt; So, for example, in BeginTransformFeedback() and EndTransformFeedback(),<br>
&gt; instead of doing this:<br>
&gt;<br>
&gt; FLUSH_VERTICES(ctx, _NEW_TRANSFORM_FEEDBACK);<br>
&gt;<br>
&gt; We would do this:<br>
&gt;<br>
&gt; FLUSH_VERTICES(ctx, ctx-&gt;StateFlags-&gt;TransformFeedback_Active);<br>
&gt;<br>
&gt; In PauseTransformFeedback() and ResumeTransformFeedback() we would do:<br>
&gt;<br>
&gt; FLUSH_VERTICES(ctx, ctx-&gt;StateFlags-&gt;TransformFeedback_Paused);<br>
&gt;<br>
&gt; And in enable.c, when rasterizer discard is turned on or off, we would do:<br>
&gt;<br>
&gt; FLUSH_VERTICES(ctx, ctx-&gt;StateFlags-&gt;RasterizerDiscard);<br>
&gt;<br>
&gt; In the i965 driver, where all of these features map to the GS stage of the<br>
&gt; pipeline, we would initialize TransformFeedback_Active,<br>
&gt; TransformFeedback_Paused, and RasterizerDiscard all to the same value.  In<br>
&gt; the r600 driver, where rasterizer discard is implemented using face culling,<br>
&gt; StateFlags-&gt;RasterizerDiscard would indicate a totally different bit than<br>
&gt; those used for transform feedback.<br>
&gt;<br>
&gt; In the short term, we could implement this technique just for rasterizer<br>
&gt; discard, to address the differences between r600 and i965 that we&#39;re<br>
&gt; discussing in this email thread.  In the long term, our goal would be to<br>
&gt; replace all of the _NEW_* constants with a fine-grained set of values in<br>
&gt; StateFlags.  Once we&#39;ve done that, each driver can set up StateFlags in a<br>
&gt; way that precisely matches how state is grouped for that particular piece of<br>
&gt; hardware.<br>
&gt;<br>
&gt; What do y&#39;all think?  If there&#39;s support for this idea I&#39;d be glad to make<br>
&gt; an RFC patch.<br>
<br>
</div></div>I like this idea very much. However, there is a catch that some _NEW<br>
flags are used for core Mesa, others are used for the vbo module,<br>
others are used for generating fixed function programs, others just<br>
notify about a change in constant buffers (e.g. the gl_* variables in<br>
GLSL) and so on, and finally, most are consumed by drivers to generate<br>
states. I am sure we can do this incrementally though and doing the<br>
easy stuff first.<br>
<span><font color="#888888"><br>
Marek<br>
</font></span></blockquote></div><br>Oh wow, I knew that some of the _NEW flags were used in core mesa, but I had no idea how many of them were affected until I did some grepping this morning.  It looks like the only _NEW flags that *aren&#39;t* used by core mesa, vbo, or some such are _NEW_POLYGONSTIPPLE and _NEW_TRANSFORM_FEEDBACK.  And since ctx-&gt;NewState is only 32 bits wide and has 31 bits assigned, this leaves us with almost zero wiggle room for driver-specific state flags.<br>
<br>I just spent a bunch of time talking with Ian and Kenneth about this, and we&#39;re gravitating back toward the idea similar to what we originally called (b) (Don&#39;t apply this patch, and instead move RasterDiscard from 
gl_context::TransformFeedback to gl_context::Transform, so that we 
restore the one-to-one correspondence between dirty bits and 
substructures of gl_context).  However, there&#39;s a problem with that: the stuff in gl_context::Transform is stuff that can be saved and restored using PushAttrib and PopAttrib.  So we can&#39;t put rasterizer discard in there either.  In fact, most of the substructures in gl_context correspond to something that can be pushed and popped, so there is really no good home for rasterizer discard.<br>
<br>So here&#39;s our new proposal:<br><br>1. Move RasterDiscard to the toplevel of gl_context<br><br>2. Since we are running out of bits in ctx-&gt;NewState, don&#39;t create a new bit for it; use _NEW_TRANSFORM (as we are currently doing).  However, to clarify what&#39;s going on, create a new<br>
<br>#define _NEW_RASTER_DISCARD _NEW_TRANSFORM<br><br>so that we can say _NEW_RASTER_DISCARD in all of the rasterizer discard places in the code.<br><br>This should address Marek&#39;s concerns about performance (since rasterizer discard won&#39;t be covered by the same dirty bit as transform feedback settings).  And it should address my concerns about keeping track of which pieces of context correspond to which dirty bits, because it will be intuitive that _NEW_RASTER_DISCARD corresponds to ctx-&gt;RasterDiscard.<br>
<br>I&#39;ll submit a patch this afternoon.<br>