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 <ito...@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; > > } > > } > > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev