anv/pipeline: Add a per-VB instance divisor
authorJason Ekstrand <jason.ekstrand@intel.com>
Mon, 2 Jul 2018 19:49:06 +0000 (12:49 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Mon, 9 Jul 2018 22:37:51 +0000 (15:37 -0700)
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
src/intel/vulkan/anv_pipeline.c
src/intel/vulkan/anv_private.h
src/intel/vulkan/genX_cmd_buffer.c
src/intel/vulkan/genX_pipeline.c

index f0bf80a..e8489e7 100644 (file)
@@ -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 =
index ae763e4..cec2842 100644 (file)
@@ -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;
index 7033e97..b7ed817 100644 (file)
@@ -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
 
index f4a455c..0821d71 100644 (file)
@@ -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
    }