From 2caf6c039289de1c26ad55c68708edd51f0b8277 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Mon, 2 Jul 2018 12:49:06 -0700 Subject: [PATCH] anv/pipeline: Add a per-VB instance divisor Reviewed-by: Caio Marcelo de Oliveira Filho --- src/intel/vulkan/anv_pipeline.c | 16 ++++++++++++++++ src/intel/vulkan/anv_private.h | 1 + src/intel/vulkan/genX_cmd_buffer.c | 7 +------ src/intel/vulkan/genX_pipeline.c | 8 ++------ 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c index f0bf80a..e8489e7 100644 --- a/src/intel/vulkan/anv_pipeline.c +++ b/src/intel/vulkan/anv_pipeline.c @@ -1421,6 +1421,22 @@ anv_pipeline_init(struct anv_pipeline *pipeline, pipeline->vb[desc->binding].instanced = true; break; } + + pipeline->vb[desc->binding].instance_divisor = 1; + } + + + /* Our implementation of VK_KHR_multiview uses instancing to draw the + * different views. If the client asks for instancing, we need to multiply + * the instance divisor by the number of views ensure that we repeat the + * client's per-instance data once for each view. + */ + if (pipeline->subpass->view_mask) { + const uint32_t view_count = anv_subpass_view_count(pipeline->subpass); + for (uint32_t vb = 0; vb < MAX_VBS; vb++) { + if (pipeline->vb[vb].instanced) + pipeline->vb[vb].instance_divisor *= view_count; + } } const VkPipelineInputAssemblyStateCreateInfo *ia_info = diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index ae763e4..cec2842 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -2386,6 +2386,7 @@ struct anv_pipeline { struct anv_pipeline_vertex_binding { uint32_t stride; bool instanced; + uint32_t instance_divisor; } vb[MAX_VBS]; bool primitive_restart; diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 7033e97..b7ed817 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -2518,12 +2518,7 @@ genX(cmd_buffer_flush_state)(struct anv_cmd_buffer *cmd_buffer) .MemoryObjectControlState = GENX(MOCS), #else .BufferAccessType = pipeline->vb[vb].instanced ? INSTANCEDATA : VERTEXDATA, - /* Our implementation of VK_KHR_multiview uses instancing to draw - * the different views. If the client asks for instancing, we - * need to use the Instance Data Step Rate to ensure that we - * repeat the client's per-instance data once for each view. - */ - .InstanceDataStepRate = anv_subpass_view_count(pipeline->subpass), + .InstanceDataStepRate = pipeline->vb[vb].instance_divisor, .VertexBufferMemoryObjectControlState = GENX(MOCS), #endif diff --git a/src/intel/vulkan/genX_pipeline.c b/src/intel/vulkan/genX_pipeline.c index f4a455c..0821d71 100644 --- a/src/intel/vulkan/genX_pipeline.c +++ b/src/intel/vulkan/genX_pipeline.c @@ -156,12 +156,8 @@ emit_vertex_input(struct anv_pipeline *pipeline, anv_batch_emit(&pipeline->batch, GENX(3DSTATE_VF_INSTANCING), vfi) { vfi.InstancingEnable = pipeline->vb[desc->binding].instanced; vfi.VertexElementIndex = slot; - /* Our implementation of VK_KHR_multiview uses instancing to draw - * the different views. If the client asks for instancing, we - * need to use the Instance Data Step Rate to ensure that we - * repeat the client's per-instance data once for each view. - */ - vfi.InstanceDataStepRate = anv_subpass_view_count(pipeline->subpass); + vfi.InstanceDataStepRate = + pipeline->vb[desc->binding].instance_divisor; } #endif } -- 2.7.4