[Mesa-dev] [PATCH 5/5] r600g: use a clever alignment for index buffer uploads 2

Constantine Kharlamov Hi-Angel at yandex.ru
Sun Mar 26 15:36:24 UTC 2017


Stolen from radeonsi

Signed-off-by: Constantine Kharlamov <Hi-Angel at yandex.ru>
---
 src/gallium/drivers/r600/r600_pipe.h         | 15 +++++++++++++++
 src/gallium/drivers/r600/r600_state_common.c |  8 +++++---
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
index 1d65cb317d..949065a8c0 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -950,6 +950,21 @@ static inline unsigned r600_get_flush_flags(enum r600_coherency coher)
 	}
 }
 
+static inline unsigned
+r600_optimal_tcc_alignment(struct r600_context *rctx, unsigned upload_size)
+{
+	unsigned alignment;
+
+	/* If the upload size is less than the cache line size (e.g. 16, 32),
+	 * the whole thing will fit into a cache line if we align it to its
+	 * size.  The idea is that multiple small uploads can share a cache
+	 * line.  If the upload size is greater, align it to the cache line
+	 * size.
+	 */
+	alignment = util_next_power_of_two(upload_size);
+	return MIN2(alignment, rctx->screen->b.info.tcc_cache_line_size);
+}
+
 #define     V_028A6C_OUTPRIM_TYPE_POINTLIST            0
 #define     V_028A6C_OUTPRIM_TYPE_LINESTRIP            1
 #define     V_028A6C_OUTPRIM_TYPE_TRISTRIP             2
diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
index 5293c4034f..04d2472aca 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -1722,7 +1722,7 @@ static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info
 			struct pipe_resource *out_buffer = NULL;
 			unsigned out_offset;
 			void *ptr;
-			unsigned start, count;
+			unsigned start, count, size;
 
 			if (likely(!info->indirect)) {
 				start = 0;
@@ -1744,8 +1744,10 @@ static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info
 				}
 			}
 
-			u_upload_alloc(ctx->stream_uploader, start, count * 2,
-                                       256, &out_offset, &out_buffer, &ptr);
+			size = count * 2;
+			u_upload_alloc(ctx->stream_uploader, start, size,
+				       r600_optimal_tcc_alignment(rctx, size),
+				       &out_offset, &out_buffer, &ptr);
 
 			util_shorten_ubyte_elts_to_userptr(
 						&rctx->b.b, &ib, 0, 0, ib.offset + start, count, ptr);
-- 
2.12.0



More information about the mesa-dev mailing list