Thanks! Series is Reviewed-by: Jason Ekstrand <ja...@jlekstrand.net>
On Wed, Feb 1, 2017 at 3:09 AM, Lionel Landwerlin < lionel.g.landwer...@intel.com> wrote: > v2: use define for buffer ID (Jason) > > Signed-off-by: Lionel Landwerlin <lionel.g.landwer...@intel.com> > Reviewed-by: Anuj Phogat <anuj.pho...@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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev