On 14 December 2011 13:42, Marek Olšák <span dir="ltr">&lt;<a href="mailto:maraeo@gmail.com">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">
I think RASTERIZER_DISCARD has nothing to do with transform feedback.<br>
I think it&#39;s part of the same spec because it&#39;s not useful without it.<br>
As I understand it, _NEW_TRANSFORM_FEEDBACK is dirty when transform<br>
feedback buffer bindings are changed or just enabled/disabled. On the<br>
other hand, RASTERIZER_DISCARD enables or disables the rasterizer, so<br>
it should fall into the same category as face culling for example. (I<br>
even implemented it using face culling on r600)<br>
<br>
Also there would be no way to know whether _NEW_TRANSFORM_FEEDBACK<br>
changes just TFB buffer bindings, or just RASTERIZER_DISCARD, or both.<br>
<br>
Marek<br></blockquote><div><br>I see where you are coming from--I could have implemented rasterizer discard on i965 gen6 in the same way.<br><br>However, I think there are three compelling reasons to consider rasterizer discard to be related to transform feedback:<br>
<br>(1) from a user perspective, it really only makes sense to use rasterizer discard when transform feedback is active.  Thus, it&#39;s highly likely that when the rasterizer discard state is changed, transform feedback settings will be changed too.<br>
<br>(2) rasterizer discard functionality is described by the same set of extensions that enable transform feedback (e.g. EXT_transform_feedback), so presumably the inventors of these two features thought they were closely related.<br>
<br>(3) the enable bit that Mesa uses to keep track of the state of rasterizer discard is in gl_context::TransformFeedback, not gl_context::Transform.<br><br>Item (3) is the most important to me.  One of the scarier things about i965 driver development is that we have to manually keep track of which hardware configuration commands correspond to which dirty bits.  If we miss a dependency, that causes a subtle bug in which a state change might not cause the hardware state to be updated properly.  These kinds of bugs are not well exposed by Piglit tests, because most Piglit tests make a large number of state changes followed by a draw operation, so a missing dependency might easily go undetected.  The thing that allows me to sleep at night is that there is a nice one-to-one correspondence between almost all of the dirty bits and corresponding substructures of gl_context.  For example, the _NEW_MODELVIEW dirty bit corresponds to gl_context::ModelView, _NEW_PROJECTION corresponds to gl_context::Projection, and so on.  That means any time I am worried that I&#39;m not handling dirty bits correctly, I can visually inspect the code and make sure that the dirty bits I&#39;m consulting match up with which elements of gl_context I&#39;m accessing.  If we leave the code as is, then there&#39;s a big undocumented exception to that one-to-one correspondence, wherein gl_context::TransformFeedback.RasterDiscard is covered by _NEW_TRANSFORM, not _NEW_TRANSFORM_FEEDBACK, as one would logically guess based on where it&#39;s located within gl_context.  I&#39;m not confident that I (or other developers) will remember this exception once we&#39;re no longer in the thick of implementing transform feedback and rasterizer discard.<br>
<br>It seems to me that we have three possible approaches to choose from here:<br><br>(a) Go ahead with this patch, and modify r600 code to recompute the face culling mode when the _NEW_TRANSFORM_FEEDBACK dirty bit is set.<br>
<br>(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.<br>
<br>(c) Do nothing, and rely on programmers to remember that RasterDiscard is an exception to the usual correspondence between dirty bits and substructures of gl_context.<br><br>I&#39;m really not comfortable with (c) because of the risk of future bugs.  I suppose I could be talked into (b) if there&#39;s popular support for it, but it&#39;s not my favourite, because as I said earlier, I think there are actually a lot of good reasons to think of rasterizer discard as related to transform feedback.  My preference is to do (a).<br>
</div></div>