anv: Decouple primitive replication check from the fragment shader
authorJason Ekstrand <jason.ekstrand@collabora.com>
Mon, 18 Jul 2022 15:45:53 +0000 (10:45 -0500)
committerMarge Bot <emma+marge@anholt.net>
Wed, 31 Aug 2022 02:00:18 +0000 (02:00 +0000)
Now that we're using nir_intrinsic_load_layer_id for ViewIndex, we can
use primitive replication even when the FS uses ViewIndex.  Also, only
check that active_stages doesn't contain anything other than VS and FS,
not that it's exactly VS | FS.  This both decouples things more and
allows primitive rplication in the depth-only case where we have no
fragment shader at all.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Caio Oliveira <caio.oliveira@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17602>

src/intel/vulkan/anv_nir_lower_multiview.c

index fbadb80..3272b2f 100644 (file)
@@ -312,19 +312,14 @@ anv_check_for_primitive_replication(nir_shader **shaders,
     * later than Vertex.  In that case only the last stage can refer to
     * gl_ViewIndex.
     */
-   if (pipeline->active_stages != (VK_SHADER_STAGE_VERTEX_BIT |
-                                   VK_SHADER_STAGE_FRAGMENT_BIT)) {
+   if (pipeline->active_stages & ~(VK_SHADER_STAGE_VERTEX_BIT |
+                                   VK_SHADER_STAGE_FRAGMENT_BIT))
       return false;
-   }
 
    uint32_t view_mask = pipeline->view_mask;
    int view_count = util_bitcount(view_mask);
    if (view_count == 1 || view_count > primitive_replication_max_views)
       return false;
 
-   /* We can't access the view index in the fragment shader. */
-   if (nir_shader_uses_view_index(shaders[MESA_SHADER_FRAGMENT]))
-      return false;
-
    return nir_can_lower_multiview(shaders[MESA_SHADER_VERTEX]);
 }