diff --git a/src/amd/common/ac_nir_lower_ngg.c b/src/amd/common/ac_nir_lower_ngg.c index 8019e6af19c..e5729d89e0d 100644 --- a/src/amd/common/ac_nir_lower_ngg.c +++ b/src/amd/common/ac_nir_lower_ngg.c @@ -3513,7 +3513,7 @@ ac_nir_lower_ngg_gs(nir_shader *shader, const ac_nir_lower_ngg_options *options) if (!options->can_cull) { nir_gs_count_vertices_and_primitives(shader, state.const_out_vtxcnt, - state.const_out_prmcnt, 4u); + state.const_out_prmcnt, NULL, 4u); state.output_compile_time_known = state.const_out_vtxcnt[0] == shader->info.gs.vertices_out && state.const_out_prmcnt[0] != -1; diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index d47d772ccbb..3b37b981cbf 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -5023,6 +5023,7 @@ void nir_dump_cfg(nir_shader *shader, FILE *fp); void nir_gs_count_vertices_and_primitives(const nir_shader *shader, int *out_vtxcnt, int *out_prmcnt, + int *out_decomposed_prmcnt, unsigned num_streams); typedef enum { diff --git a/src/compiler/nir/nir_gs_count_vertices.c b/src/compiler/nir/nir_gs_count_vertices.c index db2aa984167..23a3437c480 100644 --- a/src/compiler/nir/nir_gs_count_vertices.c +++ b/src/compiler/nir/nir_gs_count_vertices.c @@ -56,12 +56,14 @@ void nir_gs_count_vertices_and_primitives(const nir_shader *shader, int *out_vtxcnt, int *out_prmcnt, + int *out_decomposed_prmcnt, unsigned num_streams) { assert(num_streams); int vtxcnt_arr[4] = { -1, -1, -1, -1 }; int prmcnt_arr[4] = { -1, -1, -1, -1 }; + int decomposed_prmcnt_arr[4] = { -1, -1, -1, -1 }; bool cnt_found[4] = { false, false, false, false }; nir_foreach_function_impl(impl, shader) { @@ -82,6 +84,7 @@ nir_gs_count_vertices_and_primitives(const nir_shader *shader, int vtxcnt = -1; int prmcnt = -1; + int decomposed_prmcnt = -1; /* If the number of vertices/primitives is compile-time known, we use that, * otherwise we leave it at -1 which means that it's unknown. @@ -90,6 +93,8 @@ nir_gs_count_vertices_and_primitives(const nir_shader *shader, vtxcnt = nir_src_as_int(intrin->src[0]); if (nir_src_is_const(intrin->src[1])) prmcnt = nir_src_as_int(intrin->src[1]); + if (nir_src_is_const(intrin->src[2])) + decomposed_prmcnt = nir_src_as_int(intrin->src[2]); /* We've found contradictory set_vertex_and_primitive_count intrinsics. * This can happen if there are early-returns in main() and @@ -99,9 +104,12 @@ nir_gs_count_vertices_and_primitives(const nir_shader *shader, vtxcnt = -1; if (cnt_found[stream] && prmcnt != prmcnt_arr[stream]) prmcnt = -1; + if (cnt_found[stream] && decomposed_prmcnt != decomposed_prmcnt_arr[stream]) + prmcnt = -1; vtxcnt_arr[stream] = vtxcnt; prmcnt_arr[stream] = prmcnt; + decomposed_prmcnt_arr[stream] = decomposed_prmcnt; cnt_found[stream] = true; } } @@ -111,4 +119,6 @@ nir_gs_count_vertices_and_primitives(const nir_shader *shader, memcpy(out_vtxcnt, vtxcnt_arr, num_streams * sizeof(int)); if (out_prmcnt) memcpy(out_prmcnt, prmcnt_arr, num_streams * sizeof(int)); + if (out_decomposed_prmcnt) + memcpy(out_decomposed_prmcnt, decomposed_prmcnt_arr, num_streams * sizeof(int)); } diff --git a/src/intel/compiler/brw_vec4_gs_visitor.cpp b/src/intel/compiler/brw_vec4_gs_visitor.cpp index f4040d6cdb5..68e5e908cfa 100644 --- a/src/intel/compiler/brw_vec4_gs_visitor.cpp +++ b/src/intel/compiler/brw_vec4_gs_visitor.cpp @@ -632,7 +632,7 @@ brw_compile_gs(const struct brw_compiler *compiler, if (compiler->devinfo->ver >= 8) nir_gs_count_vertices_and_primitives( - nir, &prog_data->static_vertex_count, nullptr, 1u); + nir, &prog_data->static_vertex_count, nullptr, nullptr, 1u); if (compiler->devinfo->ver >= 7) { if (nir->info.gs.output_primitive == MESA_PRIM_POINTS) {