<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Nov 14, 2017 at 10:05 AM, Lionel Landwerlin <span dir="ltr"><<a href="mailto:lionel.g.landwerlin@intel.com" target="_blank">lionel.g.landwerlin@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On 13/11/17 16:12, Jason Ekstrand wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
There are enough #ifs in there that it's kind-of pointless to duplicate<br>
it for each buffer.<br>
---<br>
  src/intel/blorp/blorp_genX_exe<wbr>c.h | 69 +++++++++++++++++++-----------<wbr>---------<br>
  1 file changed, 33 insertions(+), 36 deletions(-)<br>
<br>
diff --git a/src/intel/blorp/blorp_genX_e<wbr>xec.h b/src/intel/blorp/blorp_genX_e<wbr>xec.h<br>
index 4f88650..7548392 100644<br>
--- a/src/intel/blorp/blorp_genX_e<wbr>xec.h<br>
+++ b/src/intel/blorp/blorp_genX_e<wbr>xec.h<br>
@@ -263,53 +263,50 @@ blorp_emit_input_varying_data(<wbr>struct blorp_batch *batch,<br>
  }<br>
    static void<br>
-blorp_emit_vertex_buffers(str<wbr>uct blorp_batch *batch,<br>
-                          const struct blorp_params *params)<br>
+blorp_fill_vertex_buffer_stat<wbr>e(struct blorp_batch *batch,<br>
+                               struct GENX(VERTEX_BUFFER_STATE) *vb,<br>
+                               unsigned idx,<br>
+                               struct blorp_address addr, uint32_t size,<br>
+                               uint32_t stride)<br>
  {<br>
-   struct GENX(VERTEX_BUFFER_STATE) vb[2];<br>
-   memset(vb, 0, sizeof(vb));<br>
+   vb[idx].VertexBufferIndex = idx;<br>
+   vb[idx].BufferStartingAddress = addr;<br>
+   vb[idx].BufferPitch = stride;<br>
  -   uint32_t size;<br>
-   blorp_emit_vertex_data(batch, params, &vb[0].BufferStartingAddress, &size);<br>
-   vb[0].VertexBufferIndex = 0;<br>
-   vb[0].BufferPitch = 3 * sizeof(float);<br>
  #if GEN_GEN >= 6<br>
-   vb[0].VertexBufferMOCS = batch->blorp->mocs.vb;<br>
-#endif<br>
-#if GEN_GEN >= 7<br>
-   vb[0].AddressModifyEnable = true;<br>
-#endif<br>
-#if GEN_GEN >= 8<br>
-   vb[0].BufferSize = size;<br>
-#elif GEN_GEN >= 5<br>
-   vb[0].BufferAccessType = VERTEXDATA;<br>
-   vb[0].EndAddress = vb[0].BufferStartingAddress;<br>
-   vb[0].EndAddress.offset += size - 1;<br>
-#elif GEN_GEN == 4<br>
-   vb[0].BufferAccessType = VERTEXDATA;<br>
-   vb[0].MaxIndex = 2;<br>
+   vb[idx].VertexBufferMOCS = batch->blorp->mocs.vb;<br>
  #endif<br>
  -   blorp_emit_input_varying_<wbr>data(batch, params,<br>
-                                 &vb[1].BufferStartingAddress, &size);<br>
-   vb[1].VertexBufferIndex = 1;<br>
-   vb[1].BufferPitch = 0;<br>
-#if GEN_GEN >= 6<br>
-   vb[1].VertexBufferMOCS = batch->blorp->mocs.vb;<br>
-#endif<br>
  #if GEN_GEN >= 7<br>
-   vb[1].AddressModifyEnable = true;<br>
+   vb[idx].AddressModifyEnable = true;<br>
  #endif<br>
+<br>
  #if GEN_GEN >= 8<br>
-   vb[1].BufferSize = size;<br>
+   vb[idx].BufferSize = size;<br>
  #elif GEN_GEN >= 5<br>
-   vb[1].BufferAccessType = INSTANCEDATA;<br>
-   vb[1].EndAddress = vb[1].BufferStartingAddress;<br>
-   vb[1].EndAddress.offset += size - 1;<br>
+   vb[idx].BufferAccessType = stride > 0 ? VERTEXDATA : INSTANCEDATA;<br>
+   vb[idx].EndAddress = vb[idx].BufferStartingAddress;<br>
+   vb[idx].EndAddress.offset += size - 1;<br>
  #elif GEN_GEN == 4<br>
-   vb[1].BufferAccessType = INSTANCEDATA;<br>
-   vb[1].MaxIndex = 0;<br>
+   vb[idx].BufferAccessType = stride > 0 ? VERTEXDATA : INSTANCEDATA;<br>
+   vb[idx].MaxIndex = 2;<br>
</blockquote>
<br></div></div>
This MaxIndex used to be 0 for vb[1], now it's always 2 on gen4.<br>
I can't really tell whether that's going to have an unintended effect :(<br>
</blockquote><div><br></div><div>That exists for gen4's really awkward method of bounds checking.  It may be better to just set this to "stride > 0 ? size / stride : 0".  I'll do that and see if it works.  Also, I don't think it really maters so long as it's large enough since blorp is never going to go OOB.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  #endif<br>
+}<br>
+<br>
+static void<br>
+blorp_emit_vertex_buffers(str<wbr>uct blorp_batch *batch,<br>
+                          const struct blorp_params *params)<br>
+{<br>
+   struct GENX(VERTEX_BUFFER_STATE) vb[2];<br>
+   memset(vb, 0, sizeof(vb));<br>
+<br>
+   struct blorp_address addr;<br>
+   uint32_t size;<br>
+   blorp_emit_vertex_data(batch, params, &addr, &size);<br>
+   blorp_fill_vertex_buffer_stat<wbr>e(batch, vb, 0, addr, size, 3 * sizeof(float));<br>
+<br>
+   blorp_emit_input_varying_<wbr>data(batch, params, &addr, &size);<br>
+   blorp_fill_vertex_buffer_stat<wbr>e(batch, vb, 1, addr, size, 0);<br>
       const unsigned num_dwords = 1 + GENX(VERTEX_BUFFER_STATE_lengt<wbr>h) * 2;<br>
     uint32_t *dw = blorp_emitn(batch, GENX(3DSTATE_VERTEX_BUFFERS), num_dwords);<br>
</blockquote>
<br>
<br>
</div></div></blockquote></div><br></div></div>