<div dir="ltr"><div>Thanks!  Series is<br><br></div>Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Feb 1, 2017 at 3:09 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">v2: use define for buffer ID (Jason)<br>
<br>
Signed-off-by: Lionel Landwerlin <<a href="mailto:lionel.g.landwerlin@intel.com">lionel.g.landwerlin@intel.com</a><wbr>><br>
Reviewed-by: Anuj Phogat <<a href="mailto:anuj.phogat@gmail.com">anuj.phogat@gmail.com</a>><br>
---<br>
 src/intel/vulkan/anv_private.h     |  3 ++-<br>
 src/intel/vulkan/genX_cmd_<wbr>buffer.c | 42 ++++++++++++++++++++++++++++++<wbr>+++-----<br>
 src/intel/vulkan/genX_<wbr>pipeline.c   | 25 ++++++++++++++++++++++-<br>
 3 files changed, 63 insertions(+), 7 deletions(-)<br>
<br>
diff --git a/src/intel/vulkan/anv_<wbr>private.h b/src/intel/vulkan/anv_<wbr>private.h<br>
index a0d97ac595..70c68ea609 100644<br>
--- a/src/intel/vulkan/anv_<wbr>private.h<br>
+++ b/src/intel/vulkan/anv_<wbr>private.h<br>
@@ -97,6 +97,7 @@ extern "C" {<br>
 #define MAX_IMAGES 8<br>
<br>
 #define ANV_SVGS_VB_INDEX    MAX_VBS<br>
+#define ANV_DRAWID_VB_INDEX (MAX_VBS + 1)<br>
<br>
 #define anv_printflike(a, b) __attribute__((__format__(__<wbr>printf__, a, b)))<br>
<br>
@@ -1615,7 +1616,7 @@ struct anv_image {<br>
    /**<br>
     * For color images, this is the aux usage for this image when not used as a<br>
     * color attachment.<br>
-    *<br>
+    *<br>
     * For depth/stencil images, this is set to ISL_AUX_USAGE_HIZ if the image<br>
     * has a HiZ buffer.<br>
     */<br>
diff --git a/src/intel/vulkan/genX_cmd_<wbr>buffer.c b/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
index a7c3b4380a..d74f37b01b 100644<br>
--- a/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
+++ b/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
@@ -1585,30 +1585,38 @@ genX(cmd_buffer_flush_state)(<wbr>struct anv_cmd_buffer *cmd_buffer)<br>
<span class=""> }<br>
<br>
 static void<br>
-emit_base_vertex_instance_bo(<wbr>struct anv_cmd_buffer *cmd_buffer,<br>
-                             struct anv_bo *bo, uint32_t offset)<br>
+emit_vertex_bo(struct anv_cmd_buffer *cmd_buffer,<br>
+               struct anv_bo *bo, uint32_t offset,<br>
+               uint32_t size, uint32_t index)<br>
 {<br>
    uint32_t *p = anv_batch_emitn(&cmd_buffer-><wbr>batch, 5,<br>
                                  GENX(3DSTATE_VERTEX_BUFFERS));<br>
<br>
    GENX(VERTEX_BUFFER_STATE_pack)<wbr>(&cmd_buffer->batch, p + 1,<br>
       &(struct GENX(VERTEX_BUFFER_STATE)) {<br>
</span>-         .VertexBufferIndex = ANV_SVGS_VB_INDEX, /* Reserved for this */<br>
<span class="">+         .VertexBufferIndex = index,<br>
          .AddressModifyEnable = true,<br>
          .BufferPitch = 0,<br>
 #if (GEN_GEN >= 8)<br>
          .MemoryObjectControlState = GENX(MOCS),<br>
          .BufferStartingAddress = { bo, offset },<br>
-         .BufferSize = 8<br>
+         .BufferSize = size<br>
 #else<br>
          .<wbr>VertexBufferMemoryObjectContro<wbr>lState = GENX(MOCS),<br>
          .BufferStartingAddress = { bo, offset },<br>
-         .EndAddress = { bo, offset + 8 },<br>
+         .EndAddress = { bo, offset + size },<br>
 #endif<br>
       });<br>
 }<br>
<br>
 static void<br>
+emit_base_vertex_instance_bo(<wbr>struct anv_cmd_buffer *cmd_buffer,<br>
+                             struct anv_bo *bo, uint32_t offset)<br>
+{<br>
</span>+   emit_vertex_bo(cmd_buffer, bo, offset, 8, ANV_SVGS_VB_INDEX);<br>
<span class="">+}<br>
+<br>
+static void<br>
 emit_base_vertex_instance(<wbr>struct anv_cmd_buffer *cmd_buffer,<br>
                           uint32_t base_vertex, uint32_t base_instance)<br>
 {<br>
</span>@@ -1625,6 +1633,22 @@ emit_base_vertex_instance(<wbr>struct anv_cmd_buffer *cmd_buffer,<br>
<span class="">       &cmd_buffer->device-><a href="http://dynamic_state_block_pool.bo" rel="noreferrer" target="_blank">dynamic_<wbr>state_block_pool.bo</a>, id_state.offset);<br>
 }<br>
<br>
+static void<br>
+emit_draw_index(struct anv_cmd_buffer *cmd_buffer, uint32_t draw_index)<br>
+{<br>
+   struct anv_state state =<br>
+      anv_cmd_buffer_alloc_dynamic_<wbr>state(cmd_buffer, 4, 4);<br>
+<br>
+   ((uint32_t *)state.map)[0] = draw_index;<br>
+<br>
+   if (!cmd_buffer->device->info.<wbr>has_llc)<br>
+      anv_state_clflush(state);<br>
+<br>
+   emit_vertex_bo(cmd_buffer,<br>
+                  &cmd_buffer->device-><a href="http://dynamic_state_block_pool.bo" rel="noreferrer" target="_blank">dynamic_<wbr>state_block_pool.bo</a>,<br>
</span>+                  state.offset, 4, ANV_DRAWID_VB_INDEX);<br>
<span class="">+}<br>
+<br>
 void genX(CmdDraw)(<br>
     VkCommandBuffer                             commandBuffer,<br>
     uint32_t                                    vertexCount,<br>
</span>@@ -1640,6 +1664,8 @@ void genX(CmdDraw)(<br>
<span class=""><br>
    if (vs_prog_data->uses_basevertex || vs_prog_data->uses_<wbr>baseinstance)<br>
       emit_base_vertex_instance(cmd_<wbr>buffer, firstVertex, firstInstance);<br>
+   if (vs_prog_data->uses_drawid)<br>
+      emit_draw_index(cmd_buffer, 0);<br>
<br>
    anv_batch_emit(&cmd_buffer-><wbr>batch, GENX(3DPRIMITIVE), prim) {<br>
       prim.VertexAccessType         = SEQUENTIAL;<br>
</span>@@ -1668,6 +1694,8 @@ void genX(CmdDrawIndexed)(<br>
<span class=""><br>
    if (vs_prog_data->uses_basevertex || vs_prog_data->uses_<wbr>baseinstance)<br>
       emit_base_vertex_instance(cmd_<wbr>buffer, vertexOffset, firstInstance);<br>
+   if (vs_prog_data->uses_drawid)<br>
+      emit_draw_index(cmd_buffer, 0);<br>
<br>
    anv_batch_emit(&cmd_buffer-><wbr>batch, GENX(3DPRIMITIVE), prim) {<br>
       prim.VertexAccessType         = RANDOM;<br>
</span>@@ -1706,6 +1734,8 @@ void genX(CmdDrawIndirect)(<br>
<span class=""><br>
    if (vs_prog_data->uses_basevertex || vs_prog_data->uses_<wbr>baseinstance)<br>
       emit_base_vertex_instance_bo(<wbr>cmd_buffer, bo, bo_offset + 8);<br>
+   if (vs_prog_data->uses_drawid)<br>
+      emit_draw_index(cmd_buffer, 0);<br>
<br>
    emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_VERTEX_COUNT, bo, bo_offset);<br>
    emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_INSTANCE_COUNT, bo, bo_offset + 4);<br>
</span>@@ -1739,6 +1769,8 @@ void genX(CmdDrawIndexedIndirect)(<br>
<span class="">    /* TODO: We need to stomp base vertex to 0 somehow */<br>
    if (vs_prog_data->uses_basevertex || vs_prog_data->uses_<wbr>baseinstance)<br>
       emit_base_vertex_instance_bo(<wbr>cmd_buffer, bo, bo_offset + 12);<br>
+   if (vs_prog_data->uses_drawid)<br>
+      emit_draw_index(cmd_buffer, 0);<br>
<br>
    emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_VERTEX_COUNT, bo, bo_offset);<br>
    emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_INSTANCE_COUNT, bo, bo_offset + 4);<br>
diff --git a/src/intel/vulkan/genX_<wbr>pipeline.c b/src/intel/vulkan/genX_<wbr>pipeline.c<br>
</span>index c5cddce3b7..e8cbd3ca36 100644<br>
<span class="">--- a/src/intel/vulkan/genX_<wbr>pipeline.c<br>
+++ b/src/intel/vulkan/genX_<wbr>pipeline.c<br>
@@ -102,7 +102,8 @@ emit_vertex_input(struct anv_pipeline *pipeline,<br>
    uint32_t elem_count = __builtin_popcount(elements) -<br>
       __builtin_popcount(elements_<wbr>double) / 2;<br>
<br>
-   uint32_t total_elems = elem_count + needs_svgs_elem;<br>
+   const uint32_t total_elems =<br>
+      elem_count + needs_svgs_elem + vs_prog_data->uses_drawid;<br>
    if (total_elems == 0)<br>
       return;<br>
<br>
@@ -201,6 +202,28 @@ emit_vertex_input(struct anv_pipeline *pipeline,<br>
       sgvs.InstanceIDElementOffset     = id_slot;<br>
    }<br>
 #endif<br>
+<br>
+   const uint32_t drawid_slot = elem_count + needs_svgs_elem;<br>
+   if (vs_prog_data->uses_drawid) {<br>
+      struct GENX(VERTEX_ELEMENT_STATE) element = {<br>
</span>+         .VertexBufferIndex = ANV_DRAWID_VB_INDEX,<br>
<div class="HOEnZb"><div class="h5">+         .Valid = true,<br>
+         .SourceElementFormat = ISL_FORMAT_R32_UINT,<br>
+         .Component0Control = VFCOMP_STORE_SRC,<br>
+         .Component1Control = VFCOMP_STORE_0,<br>
+         .Component2Control = VFCOMP_STORE_0,<br>
+         .Component3Control = VFCOMP_STORE_0,<br>
+      };<br>
+      GENX(VERTEX_ELEMENT_STATE_<wbr>pack)(NULL,<br>
+                                      &p[1 + drawid_slot * 2],<br>
+                                      &element);<br>
+<br>
+#if GEN_GEN >= 8<br>
+      anv_batch_emit(&pipeline-><wbr>batch, GENX(3DSTATE_VF_INSTANCING), vfi) {<br>
+         vfi.VertexElementIndex = drawid_slot;<br>
+      }<br>
+#endif<br>
+   }<br>
 }<br>
<br>
 void<br>
--<br>
2.11.0<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</div></div></blockquote></div><br></div>