From 36cb5508e891bd50308d3dffcf6f4a6fa73bbf2e Mon Sep 17 00:00:00 2001 From: Gustaw Smolarczyk Date: Thu, 13 Oct 2016 22:54:12 +0200 Subject: [PATCH] radv/winsys: Fail early on overgrown cs. When !use_ib_bos, we can't easily chain ibs one to another. If the required cs size grows over 1Mi - 8 dwords just fail the cs so that we won't assert-fail in radv_amdgpu_winsys_cs_submit later on. Reviewed-by: Bas Nieuwenhuizen --- src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c index 41dfcd323e2..b8558fafc02 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c @@ -187,12 +187,22 @@ static void radv_amdgpu_cs_grow(struct radeon_winsys_cs *_cs, size_t min_size) } if (!cs->ws->use_ib_bos) { - uint64_t ib_size = MAX2((cs->base.cdw + min_size) * 4 + 16, - cs->base.max_dw * 4 * 2); - uint32_t *new_buf = realloc(cs->base.buf, ib_size); + const uint64_t limit_dws = 0xffff8; + uint64_t ib_dws = MAX2(cs->base.cdw + min_size, + MIN2(cs->base.max_dw * 2, limit_dws)); + + /* The total ib size cannot exceed limit_dws dwords. */ + if (ib_dws > limit_dws) + { + cs->failed = true; + cs->base.cdw = 0; + return; + } + + uint32_t *new_buf = realloc(cs->base.buf, ib_dws * 4); if (new_buf) { cs->base.buf = new_buf; - cs->base.max_dw = ib_size / 4; + cs->base.max_dw = ib_dws; } else { cs->failed = true; cs->base.cdw = 0; -- 2.30.2