From: Lionel Landwerlin Date: Sun, 29 Jan 2017 03:15:03 +0000 (+0000) Subject: anv: emit DrawID if needed X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9413e11869cfeb95417df5a01101fa5d42c733e8;p=mesa.git anv: emit DrawID if needed v2: use define for buffer ID (Jason) Signed-off-by: Lionel Landwerlin Reviewed-by: Anuj Phogat Reviewed-by: Jason Ekstrand --- diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 9418a144707..51e85c74bd1 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))) @@ -1630,7 +1631,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 d3fc95ea185..303ced982dc 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -1587,29 +1587,37 @@ 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) @@ -1627,6 +1635,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, @@ -1642,6 +1666,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; @@ -1670,6 +1696,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; @@ -1708,6 +1736,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); @@ -1741,6 +1771,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 c5cddce3b73..e8cbd3ca361 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