[Mesa-dev] [PATCH v2] anv: emit DrawID if needed

Jason Ekstrand jason at jlekstrand.net
Wed Feb 1 19:07:08 UTC 2017


Thanks!  Series is

Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>

On Wed, Feb 1, 2017 at 3:09 AM, Lionel Landwerlin <
lionel.g.landwerlin at intel.com> wrote:

> v2: use define for buffer ID (Jason)
>
> Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
> Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>
> ---
>  src/intel/vulkan/anv_private.h     |  3 ++-
>  src/intel/vulkan/genX_cmd_buffer.c | 42 ++++++++++++++++++++++++++++++
> +++-----
>  src/intel/vulkan/genX_pipeline.c   | 25 ++++++++++++++++++++++-
>  3 files changed, 63 insertions(+), 7 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_
> private.h
> index a0d97ac595..70c68ea609 100644
> --- a/src/intel/vulkan/anv_private.h
> +++ b/src/intel/vulkan/anv_private.h
> @@ -97,6 +97,7 @@ extern "C" {
>  #define MAX_IMAGES 8
>
>  #define ANV_SVGS_VB_INDEX    MAX_VBS
> +#define ANV_DRAWID_VB_INDEX (MAX_VBS + 1)
>
>  #define anv_printflike(a, b) __attribute__((__format__(__printf__, a,
> b)))
>
> @@ -1615,7 +1616,7 @@ struct anv_image {
>     /**
>      * For color images, this is the aux usage for this image when not
> used as a
>      * color attachment.
> -    *
> +    *
>      * For depth/stencil images, this is set to ISL_AUX_USAGE_HIZ if the
> image
>      * has a HiZ buffer.
>      */
> diff --git a/src/intel/vulkan/genX_cmd_buffer.c
> b/src/intel/vulkan/genX_cmd_buffer.c
> index a7c3b4380a..d74f37b01b 100644
> --- a/src/intel/vulkan/genX_cmd_buffer.c
> +++ b/src/intel/vulkan/genX_cmd_buffer.c
> @@ -1585,30 +1585,38 @@ genX(cmd_buffer_flush_state)(struct
> anv_cmd_buffer *cmd_buffer)
>  }
>
>  static void
> -emit_base_vertex_instance_bo(struct anv_cmd_buffer *cmd_buffer,
> -                             struct anv_bo *bo, uint32_t offset)
> +emit_vertex_bo(struct anv_cmd_buffer *cmd_buffer,
> +               struct anv_bo *bo, uint32_t offset,
> +               uint32_t size, uint32_t index)
>  {
>     uint32_t *p = anv_batch_emitn(&cmd_buffer->batch, 5,
>                                   GENX(3DSTATE_VERTEX_BUFFERS));
>
>     GENX(VERTEX_BUFFER_STATE_pack)(&cmd_buffer->batch, p + 1,
>        &(struct GENX(VERTEX_BUFFER_STATE)) {
> -         .VertexBufferIndex = ANV_SVGS_VB_INDEX, /* Reserved for this */
> +         .VertexBufferIndex = index,
>           .AddressModifyEnable = true,
>           .BufferPitch = 0,
>  #if (GEN_GEN >= 8)
>           .MemoryObjectControlState = GENX(MOCS),
>           .BufferStartingAddress = { bo, offset },
> -         .BufferSize = 8
> +         .BufferSize = size
>  #else
>           .VertexBufferMemoryObjectControlState = GENX(MOCS),
>           .BufferStartingAddress = { bo, offset },
> -         .EndAddress = { bo, offset + 8 },
> +         .EndAddress = { bo, offset + size },
>  #endif
>        });
>  }
>
>  static void
> +emit_base_vertex_instance_bo(struct anv_cmd_buffer *cmd_buffer,
> +                             struct anv_bo *bo, uint32_t offset)
> +{
> +   emit_vertex_bo(cmd_buffer, bo, offset, 8, ANV_SVGS_VB_INDEX);
> +}
> +
> +static void
>  emit_base_vertex_instance(struct anv_cmd_buffer *cmd_buffer,
>                            uint32_t base_vertex, uint32_t base_instance)
>  {
> @@ -1625,6 +1633,22 @@ emit_base_vertex_instance(struct anv_cmd_buffer
> *cmd_buffer,
>        &cmd_buffer->device->dynamic_state_block_pool.bo, id_state.offset);
>  }
>
> +static void
> +emit_draw_index(struct anv_cmd_buffer *cmd_buffer, uint32_t draw_index)
> +{
> +   struct anv_state state =
> +      anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, 4, 4);
> +
> +   ((uint32_t *)state.map)[0] = draw_index;
> +
> +   if (!cmd_buffer->device->info.has_llc)
> +      anv_state_clflush(state);
> +
> +   emit_vertex_bo(cmd_buffer,
> +                  &cmd_buffer->device->dynamic_state_block_pool.bo,
> +                  state.offset, 4, ANV_DRAWID_VB_INDEX);
> +}
> +
>  void genX(CmdDraw)(
>      VkCommandBuffer                             commandBuffer,
>      uint32_t                                    vertexCount,
> @@ -1640,6 +1664,8 @@ void genX(CmdDraw)(
>
>     if (vs_prog_data->uses_basevertex || vs_prog_data->uses_baseinstance)
>        emit_base_vertex_instance(cmd_buffer, firstVertex, firstInstance);
> +   if (vs_prog_data->uses_drawid)
> +      emit_draw_index(cmd_buffer, 0);
>
>     anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE), prim) {
>        prim.VertexAccessType         = SEQUENTIAL;
> @@ -1668,6 +1694,8 @@ void genX(CmdDrawIndexed)(
>
>     if (vs_prog_data->uses_basevertex || vs_prog_data->uses_baseinstance)
>        emit_base_vertex_instance(cmd_buffer, vertexOffset, firstInstance);
> +   if (vs_prog_data->uses_drawid)
> +      emit_draw_index(cmd_buffer, 0);
>
>     anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE), prim) {
>        prim.VertexAccessType         = RANDOM;
> @@ -1706,6 +1734,8 @@ void genX(CmdDrawIndirect)(
>
>     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);
>
>     emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_VERTEX_COUNT, bo, bo_offset);
>     emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_INSTANCE_COUNT, bo, bo_offset
> + 4);
> @@ -1739,6 +1769,8 @@ void genX(CmdDrawIndexedIndirect)(
>     /* 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);
>
>     emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_VERTEX_COUNT, bo, bo_offset);
>     emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_INSTANCE_COUNT, bo, bo_offset
> + 4);
> diff --git a/src/intel/vulkan/genX_pipeline.c b/src/intel/vulkan/genX_
> pipeline.c
> index c5cddce3b7..e8cbd3ca36 100644
> --- a/src/intel/vulkan/genX_pipeline.c
> +++ b/src/intel/vulkan/genX_pipeline.c
> @@ -102,7 +102,8 @@ emit_vertex_input(struct anv_pipeline *pipeline,
>     uint32_t elem_count = __builtin_popcount(elements) -
>        __builtin_popcount(elements_double) / 2;
>
> -   uint32_t total_elems = elem_count + needs_svgs_elem;
> +   const uint32_t total_elems =
> +      elem_count + needs_svgs_elem + vs_prog_data->uses_drawid;
>     if (total_elems == 0)
>        return;
>
> @@ -201,6 +202,28 @@ emit_vertex_input(struct anv_pipeline *pipeline,
>        sgvs.InstanceIDElementOffset     = id_slot;
>     }
>  #endif
> +
> +   const uint32_t drawid_slot = elem_count + needs_svgs_elem;
> +   if (vs_prog_data->uses_drawid) {
> +      struct GENX(VERTEX_ELEMENT_STATE) element = {
> +         .VertexBufferIndex = ANV_DRAWID_VB_INDEX,
> +         .Valid = true,
> +         .SourceElementFormat = ISL_FORMAT_R32_UINT,
> +         .Component0Control = VFCOMP_STORE_SRC,
> +         .Component1Control = VFCOMP_STORE_0,
> +         .Component2Control = VFCOMP_STORE_0,
> +         .Component3Control = VFCOMP_STORE_0,
> +      };
> +      GENX(VERTEX_ELEMENT_STATE_pack)(NULL,
> +                                      &p[1 + drawid_slot * 2],
> +                                      &element);
> +
> +#if GEN_GEN >= 8
> +      anv_batch_emit(&pipeline->batch, GENX(3DSTATE_VF_INSTANCING), vfi)
> {
> +         vfi.VertexElementIndex = drawid_slot;
> +      }
> +#endif
> +   }
>  }
>
>  void
> --
> 2.11.0
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170201/65e11fd2/attachment-0001.html>


More information about the mesa-dev mailing list