<div dir="ltr">On 8 April 2013 10:40, Ian Romanick <span dir="ltr"><<a href="mailto:idr@freedesktop.org" target="_blank">idr@freedesktop.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 04/06/2013 08:25 PM, Paul Berry wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
When transform feedback is active, the driver manually counts the<br>
number of primitives that run through the pipeline, so that if a batch<br>
buffer flush happens, the next batch buffer can pick up transform<br>
feedback where the last batch buffer left off.  Hardware-accelerated<br>
primitive restart interferes with this process (because it makes the<br>
primitive count depend not just on the number of vertices entering the<br>
pipeline, but also on the contents of the index buffer).  So, when<br>
transform feedback is active, we need to fall back to the software<br>
implementation of primitive restart.<br>
<br>
Fixes piglit test "spec/!OpenGL 3.1/primitive-restart-xfb flush".<br>
<br>
NOTE: This is a candidate for stable release branches.<br>
</blockquote>
<br></div>
Oof.  This shouldn't be a performance hit on too many applications, thankfully.  Do we know when we're going to get real hardware counting support? :(<br></blockquote><div><br></div><div>We just had a discussion about that this morning.  There's no hardware limitation, just kernel limitations.  As far as this bug is concerned, all we need is hardware context support (which we have today).  I believe Eric is working on this.<br>
<br></div><div>As for the GL_PRIMITIVES_GENERATED and GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN queries, I believe we need some kernel changes to allow us to read the hardware counters.  I believe Eric is pinging some of the kernel folks on IRC to request that.<br>
<br></div><div>All of this stuff needs to get sorted out before we can implement geometry shaders, so I'm highly motivated to keep an eye on it and make sure it gets settled soon :)<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<br>
Reviewed-by: Ian Romanick <<a href="mailto:ian.d.romanick@intel.com" target="_blank">ian.d.romanick@intel.com</a>><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">
---<br>
  src/mesa/drivers/dri/i965/brw_<u></u>primitive_restart.c | 10 +++++++++-<br>
  1 file changed, 9 insertions(+), 1 deletion(-)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/<u></u>brw_primitive_restart.c b/src/mesa/drivers/dri/i965/<u></u>brw_primitive_restart.c<br>
index e6902b4..d0f0038 100644<br>
--- a/src/mesa/drivers/dri/i965/<u></u>brw_primitive_restart.c<br>
+++ b/src/mesa/drivers/dri/i965/<u></u>brw_primitive_restart.c<br>
@@ -27,6 +27,7 @@<br>
<br>
  #include "main/imports.h"<br>
  #include "main/bufferobj.h"<br>
+#include "main/transformfeedback.h"<br>
<br>
  #include "brw_context.h"<br>
  #include "brw_defines.h"<br>
@@ -81,11 +82,18 @@ can_cut_index_handle_prims(<u></u>struct gl_context *ctx,<br>
     struct brw_context *brw = brw_context(ctx);<br>
<br>
     if (brw->sol.counting_primitives_<u></u>generated ||<br>
-       brw->sol.counting_primitives_<u></u>written) {<br>
+       brw->sol.counting_primitives_<u></u>written ||<br>
+       _mesa_is_xfb_active_and_<u></u>unpaused(ctx)) {<br>
        /* Counting primitives generated in hardware is not currently<br>
         * supported, so take the software path. We need to investigate<br>
         * the *_PRIMITIVES_COUNT registers to allow this to be handled<br>
         * entirely in hardware.<br>
+       *<br>
+       * Note that when transform feedback is active, we also count primitives<br>
+       * (even if the client hasn't requested it), since that is the only way<br>
+       * we can start at the proper place in the transform feedback buffer<br>
+       * after a flush.  So we also have to fall back to software when<br>
+       * transform feedback is active and unpaused.<br>
         */<br>
        return false;<br>
     }<br>
<br>
</blockquote>
<br>
</div></div></blockquote></div><br></div></div>