On 6 December 2011 11:43, Eric Anholt <span dir="ltr">&lt;<a href="mailto:eric@anholt.net" target="_blank">eric@anholt.net</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>On Tue, 6 Dec 2011 09:19:15 -0800, Paul Berry &lt;<a href="mailto:stereotype441@gmail.com" target="_blank">stereotype441@gmail.com</a>&gt; wrote:<br>
&gt; On 5 December 2011 15:14, Paul Berry &lt;<a href="mailto:stereotype441@gmail.com" target="_blank">stereotype441@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; &gt; On 5 December 2011 14:53, Eric Anholt &lt;<a href="mailto:eric@anholt.net" target="_blank">eric@anholt.net</a>&gt; wrote:<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt;&gt; What I really want is to compute the vue map at the top of the pipeline<br>
&gt; &gt;&gt; and reuse it from the various places that want it.<br>
&gt; &gt;&gt;<br>
&gt; &gt;<br>
&gt; &gt; Yeah, me too.  I&#39;ll write a follow-up patch that fixes that.<br>
&gt; &gt;<br>
&gt;<br>
&gt; This morning I had an idea that I think I like even better:  What if we<br>
&gt; compute the VUE map at *link* time and store it with the compiled vertex<br>
&gt; shader?<br>
<br>
</div><div>&gt; Another argument in favor of this approach is that when we implement<br>
&gt; geometry shaders, we&#39;re going to have to keep track of two separate VUE<br>
&gt; layouts: one for data flowing from VS to GS, and another for the data<br>
&gt; flowing from GS to the rest of the pipeline.  The linker seems like the<br>
&gt; right place to do that, since it&#39;s responsible for binding VS outputs to GS<br>
&gt; inputs, and GS outputs to FS inputs.<br>
<br>
</div>I like the general idea!<br>
<br>
The link-time plan is going to be tricky to handle today because we<br>
still have the fixed function VS and VP/FP, so we don&#39;t actually have<br>
linking happening on all the programs used for rendering.<br>
<br></blockquote><div><br>Ugh.  Yeah, that&#39;s going to be tricky.<br> </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
We could even keep the same userclip optimization and still do your idea<br>
to avoid vue_map per draw by just storing the two variants of VUE map in<br>
the VP.<br>
<br></blockquote><div><br>Yeah, I thought about that too, although it feels like a lot of unnecessary complexity to preserve an optimization that was probably never necessary in the first place. <br><br>On further reflection, I guess any time we compute the VUE map for the purposes of generating code is ok (e.g. for generating a VS, GS, clip, or SF program) because the cache will ensure that we don&#39;t waste time computing it every frame.  In point of fact, those uses of the VUE map wouldn&#39;t benefit much from computing it ahead of time, since they still need to have everything the VUE map depends on in their cache keys.  So the only real problem (before this patch) is in gen{6,7}_sf_state.c, where we compute the VUE map every time we emit a _3DSTATE_SF batch.<br>
<br>At this point I&#39;m tempted to drop this patch entirely (and the idea of precomputing the VUE map), and instead have brw_vs_prog store the VUE map in brw-&gt;vs.prog_data, where gen{6,7}_sf_state.c can examine it later.  This would be safe, since for obvious reasons gen{6,7}_sf_state already depends on CACHE_NEW_VS_PROG.  That would neatly address all the concerns we&#39;ve been talking about in this thread.<br>

</div></div>