[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