<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Jun 6, 2018 at 6:39 PM, Kenneth Graunke <span dir="ltr"><<a href="mailto:kenneth@whitecape.org" target="_blank">kenneth@whitecape.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">commit 92f01fc5f914fd500497d0c3aed75f<wbr>3ac8dc054d made i965 start emitting<br>
VF cache invalidates when the high bits of vertex buffers change.  But<br>
we were not tracking vertex buffers emitted by BLORP.  This was papered<br>
over by a mistake where I emitted VF cache invalidates all the time,<br>
which Chris fixed in commit 3ac5fbadfd8644d30fce9ff267cb81<wbr>1ad157996a.<br>
<br>
This patch adds a new hook which allows the driver to track addresses<br>
and request a VF cache invalidate as appropriate.<br>
<br>
v2: Make the driver do the PIPE_CONTROL so it can apply workarounds<br>
    (caught by Jason Ekstrand).  Rebase on anv bug fix.<br>
<br>
Fixes: 92f01fc5f914 ("i965: Emit VF cache invalidates for 48-bit addressing bugs with softpin.")<br>
---<br>
 src/intel/blorp/blorp_genX_<wbr>exec.h           | 17 +++++++++----<br>
 src/intel/vulkan/genX_blorp_<wbr>exec.c          | 10 ++++++++<br>
 src/mesa/drivers/dri/i965/<wbr>genX_blorp_exec.c | 28 +++++++++++++++++++++<br>
 3 files changed, 50 insertions(+), 5 deletions(-)<br>
<br>
diff --git a/src/intel/blorp/blorp_genX_<wbr>exec.h b/src/intel/blorp/blorp_genX_<wbr>exec.h<br>
index bcaef4f367c..4800c7dcaaf 100644<br>
--- a/src/intel/blorp/blorp_genX_<wbr>exec.h<br>
+++ b/src/intel/blorp/blorp_genX_<wbr>exec.h<br>
@@ -59,6 +59,10 @@ blorp_alloc_dynamic_state(<wbr>struct blorp_batch *batch,<br>
 static void *<br>
 blorp_alloc_vertex_buffer(<wbr>struct blorp_batch *batch, uint32_t size,<br>
                           struct blorp_address *addr);<br>
+static void<br>
+blorp_vf_invalidate_for_vb_<wbr>48b_transitions(struct blorp_batch *batch,<br>
+                                           const struct blorp_address *addrs,<br>
+                                           unsigned num_vbs);<br>
<br>
 #if GEN_GEN >= 8<br>
 static struct blorp_address<br>
@@ -334,19 +338,22 @@ blorp_emit_vertex_buffers(<wbr>struct blorp_batch *batch,<br>
    uint32_t num_vbs = 2;<br>
    memset(vb, 0, sizeof(vb));<br>
<br>
-   struct blorp_address addr;<br>
+   struct blorp_address addrs[2] = {};<br>
    uint32_t size;<br>
-   blorp_emit_vertex_data(batch, params, &addr, &size);<br>
-   blorp_fill_vertex_buffer_<wbr>state(batch, vb, 0, addr, size, 3 * sizeof(float));<br>
+   blorp_emit_vertex_data(batch, params, &addrs[0], &size);<br>
+   blorp_fill_vertex_buffer_<wbr>state(batch, vb, 0, addrs[0], size,<br>
+                                  3 * sizeof(float));<br>
<br>
-   blorp_emit_input_varying_data(<wbr>batch, params, &addr, &size);<br>
-   blorp_fill_vertex_buffer_<wbr>state(batch, vb, 1, addr, size, 0);<br>
+   blorp_emit_input_varying_data(<wbr>batch, params, &addrs[1], &size);<br>
+   blorp_fill_vertex_buffer_<wbr>state(batch, vb, 1, addrs[1], size, 0);<br>
<br>
    const unsigned num_dwords = 1 + num_vbs * GENX(VERTEX_BUFFER_STATE_<wbr>length);<br>
    uint32_t *dw = blorp_emitn(batch, GENX(3DSTATE_VERTEX_BUFFERS), num_dwords);<br>
    if (!dw)<br>
       return;<br>
<br>
+   blorp_vf_invalidate_for_vb_<wbr>48b_transitions(batch, addrs, num_vbs);<br>
+<br>
    for (unsigned i = 0; i < num_vbs; i++) {<br>
       GENX(VERTEX_BUFFER_STATE_pack)<wbr>(batch, dw, &vb[i]);<br>
       dw += GENX(VERTEX_BUFFER_STATE_<wbr>length);<br>
diff --git a/src/intel/vulkan/genX_blorp_<wbr>exec.c b/src/intel/vulkan/genX_blorp_<wbr>exec.c<br>
index ecca3928de5..2035017ce0e 100644<br>
--- a/src/intel/vulkan/genX_blorp_<wbr>exec.c<br>
+++ b/src/intel/vulkan/genX_blorp_<wbr>exec.c<br>
@@ -158,6 +158,16 @@ blorp_alloc_vertex_buffer(<wbr>struct blorp_batch *batch, uint32_t size,<br>
    return vb_state.map;<br>
 }<br>
<br>
+static void<br>
+blorp_vf_invalidate_for_vb_<wbr>48b_transitions(struct blorp_batch *batch,<br>
+                                           const struct blorp_address *addrs,<br>
+                                           unsigned num_vbs)<br>
+{<br>
+   /* anv forces all vertex buffers into the low 4GB so there are never any<br>
+    * transitions that require a VF invalidation.<br>
+    */<br>
+}<br>
+<br>
 #if GEN_GEN >= 8<br>
 static struct blorp_address<br>
 blorp_get_workaround_page(<wbr>struct blorp_batch *batch)<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>genX_blorp_exec.c b/src/mesa/drivers/dri/i965/<wbr>genX_blorp_exec.c<br>
index 808bff0db85..13f8abebb47 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>genX_blorp_exec.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>genX_blorp_exec.c<br>
@@ -189,6 +189,34 @@ blorp_alloc_vertex_buffer(<wbr>struct blorp_batch *batch, uint32_t size,<br>
    return data;<br>
 }<br>
<br>
+/**<br>
+ * See vf_invalidate_for_vb_48b_<wbr>transitions in genX_state_upload.c.<br>
+ */<br>
+static void<br>
+blorp_vf_invalidate_for_vb_<wbr>48b_transitions(struct blorp_batch *batch,<br>
+                                           const struct blorp_address *addrs,<br>
+                                           unsigned num_vbs)<br>
+{<br>
+#if GEN_GEN >= 8<br>
+   struct brw_context *brw = batch->driver_batch;<br>
+   bool need_invalidate = false;<br>
+<br>
+   for (unsigned i = 0; i < num_vbs; i++) {<br>
+      struct brw_bo *bo = addrs[i].buffer;<br>
+      uint16_t high_bits =<br>
+         bo && (bo->kflags & EXEC_OBJECT_PINNED) ? bo->gtt_offset >> 32u : 0;<br>
+<br>
+      if (high_bits != brw->vb.last_bo_high_bits[i]) {<br>
+         brw->vb.last_bo_high_bits[i] = high_bits;<br>
+      }<br>
+   }<br>
+<br>
+   if (need_invalidate) {<br></blockquote><div><br></div><div>Were you planning to set this to true somewhere?<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+      brw_emit_pipe_control_flush(<wbr>brw, PIPE_CONTROL_VF_CACHE_<wbr>INVALIDATE);<br>
+   }<br>
+#endif<br>
+}<br>
+<br>
 #if GEN_GEN >= 8<br>
 static struct blorp_address<br>
 blorp_get_workaround_page(<wbr>struct blorp_batch *batch)<br>
<span class="HOEnZb"><font color="#888888">-- <br>
2.17.0<br>
<br>
</font></span></blockquote></div><br></div></div>