anv: Trivially implement multiDrawIndirect
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 20 Apr 2017 00:37:46 +0000 (17:37 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 3 May 2017 18:25:46 +0000 (11:25 -0700)
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
src/intel/vulkan/anv_device.c
src/intel/vulkan/genX_cmd_buffer.c

index fc5baac0ac042c4792938240e254b529a18c36a3..289e79b231c3db537c05682516c28e90c36770b7 100644 (file)
@@ -564,7 +564,7 @@ void anv_GetPhysicalDeviceFeatures(
       .sampleRateShading                        = true,
       .dualSrcBlend                             = true,
       .logicOp                                  = true,
-      .multiDrawIndirect                        = false,
+      .multiDrawIndirect                        = true,
       .drawIndirectFirstInstance                = true,
       .depthClamp                               = true,
       .depthBiasClamp                           = true,
index 163c0226be1f8796058bb2bed1851a70d6791b88..bfb54729c0f554122a1a0f43e5ddd9f76ff5d611 100644 (file)
@@ -1880,25 +1880,30 @@ void genX(CmdDrawIndirect)(
    ANV_FROM_HANDLE(anv_buffer, buffer, _buffer);
    struct anv_pipeline *pipeline = cmd_buffer->state.pipeline;
    const struct brw_vs_prog_data *vs_prog_data = get_vs_prog_data(pipeline);
-   struct anv_bo *bo = buffer->bo;
-   uint32_t bo_offset = buffer->offset + offset;
 
    if (anv_batch_has_error(&cmd_buffer->batch))
       return;
 
    genX(cmd_buffer_flush_state)(cmd_buffer);
 
-   if (vs_prog_data->uses_basevertex || vs_prog_data->uses_baseinstance)
-      emit_base_vertex_instance_bo(cmd_buffer, bo, bo_offset + 8);
-   if (vs_prog_data->uses_drawid)
-      emit_draw_index(cmd_buffer, 0);
+   for (uint32_t i = 0; i < drawCount; i++) {
+      struct anv_bo *bo = buffer->bo;
+      uint32_t bo_offset = buffer->offset + offset;
 
-   load_indirect_parameters(cmd_buffer, buffer, offset, false);
+      if (vs_prog_data->uses_basevertex || vs_prog_data->uses_baseinstance)
+         emit_base_vertex_instance_bo(cmd_buffer, bo, bo_offset + 8);
+      if (vs_prog_data->uses_drawid)
+         emit_draw_index(cmd_buffer, i);
 
-   anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE), prim) {
-      prim.IndirectParameterEnable  = true;
-      prim.VertexAccessType         = SEQUENTIAL;
-      prim.PrimitiveTopologyType    = pipeline->topology;
+      load_indirect_parameters(cmd_buffer, buffer, offset, false);
+
+      anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE), prim) {
+         prim.IndirectParameterEnable  = true;
+         prim.VertexAccessType         = SEQUENTIAL;
+         prim.PrimitiveTopologyType    = pipeline->topology;
+      }
+
+      offset += stride;
    }
 }
 
@@ -1913,26 +1918,31 @@ void genX(CmdDrawIndexedIndirect)(
    ANV_FROM_HANDLE(anv_buffer, buffer, _buffer);
    struct anv_pipeline *pipeline = cmd_buffer->state.pipeline;
    const struct brw_vs_prog_data *vs_prog_data = get_vs_prog_data(pipeline);
-   struct anv_bo *bo = buffer->bo;
-   uint32_t bo_offset = buffer->offset + offset;
 
    if (anv_batch_has_error(&cmd_buffer->batch))
       return;
 
    genX(cmd_buffer_flush_state)(cmd_buffer);
 
-   /* TODO: We need to stomp base vertex to 0 somehow */
-   if (vs_prog_data->uses_basevertex || vs_prog_data->uses_baseinstance)
-      emit_base_vertex_instance_bo(cmd_buffer, bo, bo_offset + 12);
-   if (vs_prog_data->uses_drawid)
-      emit_draw_index(cmd_buffer, 0);
+   for (uint32_t i = 0; i < drawCount; i++) {
+      struct anv_bo *bo = buffer->bo;
+      uint32_t bo_offset = buffer->offset + offset;
 
-   load_indirect_parameters(cmd_buffer, buffer, offset, true);
+      /* TODO: We need to stomp base vertex to 0 somehow */
+      if (vs_prog_data->uses_basevertex || vs_prog_data->uses_baseinstance)
+         emit_base_vertex_instance_bo(cmd_buffer, bo, bo_offset + 12);
+      if (vs_prog_data->uses_drawid)
+         emit_draw_index(cmd_buffer, i);
 
-   anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE), prim) {
-      prim.IndirectParameterEnable  = true;
-      prim.VertexAccessType         = RANDOM;
-      prim.PrimitiveTopologyType    = pipeline->topology;
+      load_indirect_parameters(cmd_buffer, buffer, offset, true);
+
+      anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE), prim) {
+         prim.IndirectParameterEnable  = true;
+         prim.VertexAccessType         = RANDOM;
+         prim.PrimitiveTopologyType    = pipeline->topology;
+      }
+
+      offset += stride;
    }
 }