anv/pipeline: Add a per-VB instance divisor

Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
This commit is contained in:
Jason Ekstrand
2018-07-02 12:49:06 -07:00
parent 32f4feb5a0
commit 2caf6c0392
4 changed files with 20 additions and 12 deletions

View File

@@ -1421,6 +1421,22 @@ anv_pipeline_init(struct anv_pipeline *pipeline,
pipeline->vb[desc->binding].instanced = true; pipeline->vb[desc->binding].instanced = true;
break; 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 = const VkPipelineInputAssemblyStateCreateInfo *ia_info =

View File

@@ -2386,6 +2386,7 @@ struct anv_pipeline {
struct anv_pipeline_vertex_binding { struct anv_pipeline_vertex_binding {
uint32_t stride; uint32_t stride;
bool instanced; bool instanced;
uint32_t instance_divisor;
} vb[MAX_VBS]; } vb[MAX_VBS];
bool primitive_restart; bool primitive_restart;

View File

@@ -2518,12 +2518,7 @@ genX(cmd_buffer_flush_state)(struct anv_cmd_buffer *cmd_buffer)
.MemoryObjectControlState = GENX(MOCS), .MemoryObjectControlState = GENX(MOCS),
#else #else
.BufferAccessType = pipeline->vb[vb].instanced ? INSTANCEDATA : VERTEXDATA, .BufferAccessType = pipeline->vb[vb].instanced ? INSTANCEDATA : VERTEXDATA,
/* Our implementation of VK_KHR_multiview uses instancing to draw .InstanceDataStepRate = pipeline->vb[vb].instance_divisor,
* 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),
.VertexBufferMemoryObjectControlState = GENX(MOCS), .VertexBufferMemoryObjectControlState = GENX(MOCS),
#endif #endif

View File

@@ -156,12 +156,8 @@ emit_vertex_input(struct anv_pipeline *pipeline,
anv_batch_emit(&pipeline->batch, GENX(3DSTATE_VF_INSTANCING), vfi) { anv_batch_emit(&pipeline->batch, GENX(3DSTATE_VF_INSTANCING), vfi) {
vfi.InstancingEnable = pipeline->vb[desc->binding].instanced; vfi.InstancingEnable = pipeline->vb[desc->binding].instanced;
vfi.VertexElementIndex = slot; vfi.VertexElementIndex = slot;
/* Our implementation of VK_KHR_multiview uses instancing to draw vfi.InstanceDataStepRate =
* the different views. If the client asks for instancing, we pipeline->vb[desc->binding].instance_divisor;
* 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);
} }
#endif #endif
} }