anv: assert when number of primitives is higher than max
authorMarcin Ślusarz <marcin.slusarz@intel.com>
Mon, 12 Dec 2022 13:29:52 +0000 (14:29 +0100)
committerMarge Bot <emma+marge@anholt.net>
Wed, 14 Dec 2022 09:55:11 +0000 (09:55 +0000)
Such cases can lead to memory corruptions.

Acked-by: Caio Oliveira <caio.oliveira@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20279>

src/intel/vulkan/anv_pipeline.c

index c8b5dc8..1c4d4b9 100644 (file)
@@ -84,6 +84,14 @@ anv_nir_lower_set_vtx_and_prim_count_instr(nir_builder *b, nir_instr *instr, voi
    if (intrin->intrinsic != nir_intrinsic_set_vertex_and_primitive_count)
       return false;
 
+   /* Detect some cases of invalid primitive count. They might lead to URB
+    * memory corruption, where workgroups overwrite each other output memory.
+    */
+   if (nir_src_is_const(intrin->src[1]) &&
+         nir_src_as_uint(intrin->src[1]) > b->shader->info.mesh.max_primitives_out) {
+      assert(!"number of primitives bigger than max specified");
+   }
+
    struct lower_set_vtx_and_prim_count_state *state = data;
    /* this intrinsic should show up only once */
    assert(state->primitive_count == NULL);