<div dir="ltr"><div dir="ltr">Hi all,<br><br>Could somebody take a look at this patch?<br><br>Regards,<br>Andrii.<br></div></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 missing 3DSTATE_URB_* commands in a batch after<br>
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 -auto -fbo" piglit test with this workaround<br>
led to a hung. The hung investigation helped to find that some batches<br>
didn't have the 3DSTATE_URB_* commands 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       |  8 ++++++++<br>
 src/mesa/drivers/dri/i965/intel_batchbuffer.c | 12 ++++++++++++<br>
 2 files changed, 20 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 7fd15669eb..4e1682ba5c 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,14 @@ struct intel_batchbuffer {<br>
       int batch_reloc_count;<br>
       int state_reloc_count;<br>
       int exec_count;<br>
+      struct {<br>
+         GLuint vsize;<br>
+         GLuint gsize;<br>
+         GLuint hsize;<br>
+         GLuint dsize;<br>
+         bool gs_present;<br>
+         bool tess_present;<br>
+      } urb;<br>
    } saved;<br>
<br>
    /** Map from batch offset to brw_state_batch data (with DEBUG_BATCH) */<br>
diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c b/src/mesa/drivers/dri/i965/intel_batchbuffer.c<br>
index 353fcba18f..bae9f2ffed 100644<br>
--- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c<br>
+++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c<br>
@@ -299,6 +299,12 @@ intel_batchbuffer_save_state(struct brw_context *brw)<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.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>
+   brw->batch.saved.urb.tess_present = brw->urb.tess_present;<br>
+   brw->batch.saved.urb.hsize = brw->urb.hsize;<br>
+   brw->batch.saved.urb.dsize = brw->urb.dsize;<br>
 }<br>
<br>
 void<br>
@@ -313,6 +319,12 @@ 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->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>
+   brw->urb.tess_present = brw->batch.saved.urb.tess_present;<br>
+   brw->urb.hsize = brw->batch.saved.urb.hsize;<br>
+   brw->urb.dsize = brw->batch.saved.urb.dsize;<br>
    if (USED_BATCH(brw->batch) == 0)<br>
       brw_new_batch(brw);<br>
 }<br>
-- <br>
2.17.1<br>
<br>
</blockquote></div>