[Mesa-dev] [PATCH 2/2] radv/winsys: skip padded empty buffers in chain. (v2)

Dave Airlie airlied at gmail.com
Thu Jan 18 02:04:15 UTC 2018


From: Dave Airlie <airlied at redhat.com>

When chaining buffers if we see an empty one (just padded)
skip over it.

v2: set empty_padded on init/reset, and unset on grow,
then check once (Bas).
---
 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
index 5632b1d4ee2..9768f36f113 100644
--- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
+++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
@@ -57,6 +57,7 @@ struct radv_amdgpu_cs {
 	unsigned                    *ib_size_ptr;
 	bool                        failed;
 	bool                        is_chained;
+	bool                        empty_padded;
 
 	int                         buffer_hash_table[1024];
 	unsigned                    hw_ip;
@@ -182,6 +183,7 @@ static void radv_amdgpu_init_cs(struct radv_amdgpu_cs *cs,
 		cs->buffer_hash_table[i] = -1;
 
 	cs->hw_ip = ring_to_hw_ip(ring_type);
+	cs->empty_padded = true;
 }
 
 static struct radeon_winsys_cs *
@@ -316,7 +318,7 @@ static void radv_amdgpu_cs_grow(struct radeon_winsys_cs *_cs, size_t min_size)
 	cs->base.buf = (uint32_t *)cs->ib_mapped;
 	cs->base.cdw = 0;
 	cs->base.max_dw = ib_size / 4 - 4;
-
+	cs->empty_padded = false;
 }
 
 static bool radv_amdgpu_cs_finalize(struct radeon_winsys_cs *_cs)
@@ -324,6 +326,9 @@ static bool radv_amdgpu_cs_finalize(struct radeon_winsys_cs *_cs)
 	struct radv_amdgpu_cs *cs = radv_amdgpu_cs(_cs);
 
 	if (cs->ws->use_ib_bos) {
+
+		if (cs->empty_padded && cs->base.cdw == 0)
+			cs->empty_padded = true;
 		while (!cs->base.cdw || (cs->base.cdw & 7) != 0)
 			cs->base.buf[cs->base.cdw++] = 0xffff1000;
 
@@ -340,6 +345,7 @@ static void radv_amdgpu_cs_reset(struct radeon_winsys_cs *_cs)
 	struct radv_amdgpu_cs *cs = radv_amdgpu_cs(_cs);
 	cs->base.cdw = 0;
 	cs->failed = false;
+	cs->empty_padded = true;
 
 	for (unsigned i = 0; i < cs->num_buffers; ++i) {
 		unsigned hash = ((uintptr_t)cs->handles[i] >> 6) &
@@ -687,17 +693,25 @@ static int radv_amdgpu_winsys_cs_submit_chained(struct radeon_winsys_ctx *_ctx,
 	amdgpu_bo_list_handle bo_list;
 	struct amdgpu_cs_request request = {0};
 	struct amdgpu_cs_ib_info ibs[2];
-
+	int skip_count = 0;
 	for (unsigned i = cs_count; i--;) {
 		struct radv_amdgpu_cs *cs = radv_amdgpu_cs(cs_array[i]);
-
+		int next_idx = 1;
 		if (cs->is_chained) {
 			*cs->ib_size_ptr -= 4;
 			cs->is_chained = false;
 		}
 
-		if (i + 1 < cs_count) {
-			struct radv_amdgpu_cs *next = radv_amdgpu_cs(cs_array[i + 1]);
+		if (cs->empty_padded)
+			skip_count++;
+		else {
+			next_idx += skip_count;
+			skip_count = 0;
+		}
+
+		if (i + next_idx < cs_count) {
+			struct radv_amdgpu_cs *next = radv_amdgpu_cs(cs_array[i + next_idx]);
+
 			assert(cs->base.cdw + 4 <= cs->base.max_dw);
 
 			cs->is_chained = true;
-- 
2.14.3



More information about the mesa-dev mailing list