anv: Decouple primitive replication check from the fragment shader

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>
This commit is contained in:
Jason Ekstrand
2022-07-18 10:45:53 -05:00
committed by Marge Bot
parent 08d3c0e8e1
commit 4bdbc4c93f

View 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]);
}