Mesa (master): radv: don't subtract max_verts_per_prim from hw_max_esverts on gfx10.3

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Nov 17 10:45:58 UTC 2020


Module: Mesa
Branch: master
Commit: d25d097d3d524e1e8c5ab3f9dc91cf155fb0687a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=d25d097d3d524e1e8c5ab3f9dc91cf155fb0687a

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Wed Nov 11 09:24:06 2020 +0100

radv: don't subtract max_verts_per_prim from hw_max_esverts on gfx10.3

Ported from RadeonSI.

GFX10.3 does it properly.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7566>

---

 src/amd/vulkan/radv_pipeline.c | 30 ++++++++++++++++++++++--------
 1 file changed, 22 insertions(+), 8 deletions(-)

diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index 51ed322cdd0..713a2379af7 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -2073,8 +2073,12 @@ gfx10_get_ngg_info(const struct radv_pipeline_key *key,
 						   (max_lds_size - max_gsprims * gsprim_lds_size) /
 						   esvert_lds_size);
 			max_esverts = MIN2(max_esverts, max_gsprims * max_verts_per_prim);
+
 			/* Hardware restriction: minimum value of max_esverts */
-			max_esverts = MAX2(max_esverts, min_esverts - 1 + max_verts_per_prim);
+			if (pipeline->device->physical_device->rad_info.chip_class == GFX10)
+				max_esverts = MAX2(max_esverts, min_esverts - 1 + max_verts_per_prim);
+			else
+				max_esverts = MAX2(max_esverts, min_esverts);
 
 			max_gsprims = align(max_gsprims, wavesize);
 			max_gsprims = MIN2(max_gsprims, max_gsprims_base);
@@ -2095,10 +2099,16 @@ gfx10_get_ngg_info(const struct radv_pipeline_key *key,
 		} while (orig_max_esverts != max_esverts || orig_max_gsprims != max_gsprims);
 
 		/* Verify the restriction. */
-		assert(max_esverts >= min_esverts - 1 + max_verts_per_prim);
+		if (pipeline->device->physical_device->rad_info.chip_class == GFX10)
+			assert(max_esverts >= min_esverts - 1 + max_verts_per_prim);
+		else
+			assert(max_esverts >= min_esverts);
 	} else {
 		/* Hardware restriction: minimum value of max_esverts */
-		max_esverts = MAX2(max_esverts, min_esverts - 1 + max_verts_per_prim);
+		if (pipeline->device->physical_device->rad_info.chip_class == GFX10)
+			max_esverts = MAX2(max_esverts, min_esverts - 1 + max_verts_per_prim);
+		else
+			max_esverts = MAX2(max_esverts, min_esverts);
 	}
 
 	unsigned max_out_vertices =
@@ -2115,12 +2125,16 @@ gfx10_get_ngg_info(const struct radv_pipeline_key *key,
 		prim_amp_factor = gs_info->gs.vertices_out;
 	}
 
-	/* The GE only checks against the maximum number of ES verts after
-	 * allocating a full GS primitive. So we need to ensure that whenever
-	 * this check passes, there is enough space for a full primitive without
-	 * vertex reuse.
+	/* On Gfx10, the GE only checks against the maximum number of ES verts
+	 * after allocating a full GS primitive. So we need to ensure that
+	 * whenever this check passes, there is enough space for a full
+	 * primitive without vertex reuse.
 	 */
-	ngg->hw_max_esverts = max_esverts - max_verts_per_prim + 1;
+	if (pipeline->device->physical_device->rad_info.chip_class == GFX10)
+		ngg->hw_max_esverts = max_esverts - max_verts_per_prim + 1;
+	else
+		ngg->hw_max_esverts = max_esverts;
+
 	ngg->max_gsprims = max_gsprims;
 	ngg->max_out_verts = max_out_vertices;
 	ngg->prim_amp_factor = prim_amp_factor;



More information about the mesa-commit mailing list