<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Hi all,<br><br>Could somebody take a look at this patch?<br><br>Regards,<br>Andrii.</div><br><div class="gmail_quote"><div dir="ltr">On Mon, Nov 19, 2018 at 11:19 PM <<a href="mailto:asimiklit.work@gmail.com">asimiklit.work@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">From: Andrii Simiklit <<a href="mailto:andrii.simiklit@globallogic.com" target="_blank">andrii.simiklit@globallogic.com</a>><br>
<br>
This patch is needed to avoid incorrect value of StreamOffset flag<br>
in 3DSTATE_SO_BUFFER command after rollback operation.<br>
<br>
To be able to test easily this issue<br>
the following workaround is necessary:<br>
-if (!brw_batch_has_aperture_space(brw, 0)) {<br>
by:<br>
+if (true) {<br>
in brw_draw_single_prim function.<br>
<br>
This workaround forces a rollback for each batch.<br>
The "gl-3.2-adj-prims pv-first -fbo" piglit test with this workaround failed<br>
(when URB requirements was fixed this test started to fail instead of a hang).<br>
Investigation of this failure helped to find that some batches have a different<br>
Stream Offset in the 3D STATE_SO_BUFFER command in compare to batches which were<br>
generated without this workaround.<br>
<br>
Reported-by: Kenneth Graunke <<a href="mailto:kenneth@whitecape.org" target="_blank">kenneth@whitecape.org</a>><br>
Signed-off-by: Andrii Simiklit <<a href="mailto:andrii.simiklit@globallogic.com" target="_blank">andrii.simiklit@globallogic.com</a>><br>
---<br>
 src/mesa/drivers/dri/i965/brw_context.h       |  3 +++<br>
 src/mesa/drivers/dri/i965/intel_batchbuffer.c | 10 ++++++++++<br>
 2 files changed, 13 insertions(+)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h<br>
index 4e1682ba5c..86c9bf0a5c 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_context.h<br>
+++ b/src/mesa/drivers/dri/i965/brw_context.h<br>
@@ -521,6 +521,9 @@ struct intel_batchbuffer {<br>
       int batch_reloc_count;<br>
       int state_reloc_count;<br>
       int exec_count;<br>
+      struct {<br>
+         bool zero_offsets;<br>
+      } xfb;<br>
       struct {<br>
          GLuint vsize;<br>
          GLuint gsize;<br>
diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c b/src/mesa/drivers/dri/i965/intel_batchbuffer.c<br>
index bae9f2ffed..85e5f64123 100644<br>
--- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c<br>
+++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c<br>
@@ -295,10 +295,15 @@ intel_batchbuffer_reset_and_clear_render_cache(struct brw_context *brw)<br>
 void<br>
 intel_batchbuffer_save_state(struct brw_context *brw)<br>
 {<br>
+   struct brw_transform_feedback_object *brw_xfb_obj =<br>
+                   (struct brw_transform_feedback_object *)<br>
+                        brw->ctx.TransformFeedback.CurrentObject;<br>
+<br>
    brw->batch.saved.map_next = brw->batch.map_next;<br>
    brw->batch.saved.batch_reloc_count = brw->batch.batch_relocs.reloc_count;<br>
    brw->batch.saved.state_reloc_count = brw->batch.state_relocs.reloc_count;<br>
    brw->batch.saved.exec_count = brw->batch.exec_count;<br>
+   brw->batch.saved.xfb.zero_offsets = brw_xfb_obj->zero_offsets;<br>
    brw->batch.saved.urb.vsize = brw->urb.vsize;<br>
    brw->batch.saved.urb.gs_present = brw->urb.gs_present;<br>
    brw->batch.saved.urb.gsize = brw->urb.gsize;<br>
@@ -310,6 +315,10 @@ intel_batchbuffer_save_state(struct brw_context *brw)<br>
 void<br>
 intel_batchbuffer_reset_to_saved(struct brw_context *brw)<br>
 {<br>
+   struct brw_transform_feedback_object *brw_xfb_obj =<br>
+                   (struct brw_transform_feedback_object *)<br>
+                        brw->ctx.TransformFeedback.CurrentObject;<br>
+<br>
    for (int i = brw->batch.saved.exec_count;<br>
         i < brw->batch.exec_count; i++) {<br>
       brw_bo_unreference(brw->batch.exec_bos[i]);<br>
@@ -319,6 +328,7 @@ intel_batchbuffer_reset_to_saved(struct brw_context *brw)<br>
    brw->batch.exec_count = brw->batch.saved.exec_count;<br>
<br>
    brw->batch.map_next = brw->batch.saved.map_next;<br>
+   brw_xfb_obj->zero_offsets = brw->batch.saved.xfb.zero_offsets;<br>
    brw->urb.vsize = brw->batch.saved.urb.vsize;<br>
    brw->urb.gs_present = brw->batch.saved.urb.gs_present;<br>
    brw->urb.gsize = brw->batch.saved.urb.gsize;<br>
-- <br>
2.17.1<br>
<br>
</blockquote></div></div></div></div>