Mesa (master): radeonsi: prefetch VBO descriptors after the first VGT shader

Marek Olšák mareko at kemper.freedesktop.org
Mon Aug 7 19:12:31 UTC 2017


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

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Fri Aug  4 17:26:58 2017 +0200

radeonsi: prefetch VBO descriptors after the first VGT shader

Tested-by: Dieter Nützel <Dieter at nuetzel-hh.de>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>

---

 src/gallium/drivers/radeonsi/si_cp_dma.c | 80 +++++++++++++++++++++++++-------
 1 file changed, 63 insertions(+), 17 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_cp_dma.c b/src/gallium/drivers/radeonsi/si_cp_dma.c
index 21202b3d5b..91a6aff4c1 100644
--- a/src/gallium/drivers/radeonsi/si_cp_dma.c
+++ b/src/gallium/drivers/radeonsi/si_cp_dma.c
@@ -448,27 +448,73 @@ static void cik_prefetch_shader_async(struct si_context *sctx,
 	cik_prefetch_TC_L2_async(sctx, bo, 0, bo->width0);
 }
 
+static void cik_prefetch_VBO_descriptors(struct si_context *sctx)
+{
+	cik_prefetch_TC_L2_async(sctx, &sctx->vertex_buffers.buffer->b.b,
+				 sctx->vertex_buffers.buffer_offset,
+				 sctx->vertex_elements->desc_list_byte_size);
+}
+
 void cik_emit_prefetch_L2(struct si_context *sctx)
 {
 	/* Prefetch shaders and VBO descriptors to TC L2. */
-	if (sctx->prefetch_L2_mask & SI_PREFETCH_LS)
-		cik_prefetch_shader_async(sctx, sctx->queued.named.ls);
-	if (sctx->prefetch_L2_mask & SI_PREFETCH_HS)
-		cik_prefetch_shader_async(sctx, sctx->queued.named.hs);
-	if (sctx->prefetch_L2_mask & SI_PREFETCH_ES)
-		cik_prefetch_shader_async(sctx, sctx->queued.named.es);
-	if (sctx->prefetch_L2_mask & SI_PREFETCH_GS)
-		cik_prefetch_shader_async(sctx, sctx->queued.named.gs);
-	if (sctx->prefetch_L2_mask & SI_PREFETCH_VS)
-		cik_prefetch_shader_async(sctx, sctx->queued.named.vs);
-
-	/* Vertex buffer descriptors are uploaded uncached, so prefetch
-	 * them right after the VS binary. */
-	if (sctx->prefetch_L2_mask & SI_PREFETCH_VBO_DESCRIPTORS) {
-		cik_prefetch_TC_L2_async(sctx, &sctx->vertex_buffers.buffer->b.b,
-					 sctx->vertex_buffers.buffer_offset,
-					 sctx->vertex_elements->desc_list_byte_size);
+	if (sctx->b.chip_class >= GFX9) {
+		/* Choose the right spot for the VBO prefetch. */
+		if (sctx->tes_shader.cso) {
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_HS)
+				cik_prefetch_shader_async(sctx, sctx->queued.named.hs);
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_VBO_DESCRIPTORS)
+				cik_prefetch_VBO_descriptors(sctx);
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_GS)
+				cik_prefetch_shader_async(sctx, sctx->queued.named.gs);
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_VS)
+				cik_prefetch_shader_async(sctx, sctx->queued.named.vs);
+		} else if (sctx->gs_shader.cso) {
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_GS)
+				cik_prefetch_shader_async(sctx, sctx->queued.named.gs);
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_VBO_DESCRIPTORS)
+				cik_prefetch_VBO_descriptors(sctx);
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_VS)
+				cik_prefetch_shader_async(sctx, sctx->queued.named.vs);
+		} else {
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_VS)
+				cik_prefetch_shader_async(sctx, sctx->queued.named.vs);
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_VBO_DESCRIPTORS)
+				cik_prefetch_VBO_descriptors(sctx);
+		}
+	} else {
+		/* SI-CI-VI */
+		/* Choose the right spot for the VBO prefetch. */
+		if (sctx->tes_shader.cso) {
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_LS)
+				cik_prefetch_shader_async(sctx, sctx->queued.named.ls);
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_VBO_DESCRIPTORS)
+				cik_prefetch_VBO_descriptors(sctx);
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_HS)
+				cik_prefetch_shader_async(sctx, sctx->queued.named.hs);
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_ES)
+				cik_prefetch_shader_async(sctx, sctx->queued.named.es);
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_GS)
+				cik_prefetch_shader_async(sctx, sctx->queued.named.gs);
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_VS)
+				cik_prefetch_shader_async(sctx, sctx->queued.named.vs);
+		} else if (sctx->gs_shader.cso) {
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_ES)
+				cik_prefetch_shader_async(sctx, sctx->queued.named.es);
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_VBO_DESCRIPTORS)
+				cik_prefetch_VBO_descriptors(sctx);
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_GS)
+				cik_prefetch_shader_async(sctx, sctx->queued.named.gs);
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_VS)
+				cik_prefetch_shader_async(sctx, sctx->queued.named.vs);
+		} else {
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_VS)
+				cik_prefetch_shader_async(sctx, sctx->queued.named.vs);
+			if (sctx->prefetch_L2_mask & SI_PREFETCH_VBO_DESCRIPTORS)
+				cik_prefetch_VBO_descriptors(sctx);
+		}
 	}
+
 	if (sctx->prefetch_L2_mask & SI_PREFETCH_PS)
 		cik_prefetch_shader_async(sctx, sctx->queued.named.ps);
 




More information about the mesa-commit mailing list