[Mesa-dev] [PATCH v3 14/14] anv: Trivially implement multiDrawIndirect

Iago Toral itoral at igalia.com
Wed May 3 07:07:49 UTC 2017


On Wed, 2017-05-03 at 09:04 +0200, Iago Toral wrote:
> On Thu, 2017-04-27 at 09:31 -0700, Jason Ekstrand wrote:
> > 
> > ---
> >  src/intel/vulkan/anv_device.c      |  2 +-
> >  src/intel/vulkan/genX_cmd_buffer.c | 56 ++++++++++++++++++++++----
> > ------------
> >  2 files changed, 34 insertions(+), 24 deletions(-)
> > 
> > diff --git a/src/intel/vulkan/anv_device.c
> > b/src/intel/vulkan/anv_device.c
> > index b2edb54..93f7401 100644
> > --- a/src/intel/vulkan/anv_device.c
> > +++ b/src/intel/vulkan/anv_device.c
> > @@ -522,7 +522,7 @@ void anv_GetPhysicalDeviceFeatures(
> >        .sampleRateShading                        = true,
> >        .dualSrcBlend                             = true,
> >        .logicOp                                  = true,
> > -      .multiDrawIndirect                        = false,
> > +      .multiDrawIndirect                        = true,
> >        .drawIndirectFirstInstance                = true,
> >        .depthClamp                               = true,
> >        .depthBiasClamp                           = true,
> > diff --git a/src/intel/vulkan/genX_cmd_buffer.c
> > b/src/intel/vulkan/genX_cmd_buffer.c
> > index 163c022..bfb5472 100644
> > --- a/src/intel/vulkan/genX_cmd_buffer.c
> > +++ b/src/intel/vulkan/genX_cmd_buffer.c
> > @@ -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;
> You can put the line above before the loop, maybe make 'bo' const
> too.

Forget the const part since that will make the compiler spit a bunch of
warnings for the qualifier being discarded by the various emit
functions below.

> Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>
> 
> > 
> > +      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;
> >     }
> >  }
> >  


More information about the mesa-dev mailing list