summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustaw Smolarczyk <[email protected]>2016-10-13 22:54:12 +0200
committerBas Nieuwenhuizen <[email protected]>2016-10-16 12:38:53 +0200
commit36cb5508e891bd50308d3dffcf6f4a6fa73bbf2e (patch)
tree104aa892a224b1587b56ee6c725871c32cabf96c
parent493237d4eed9d4e89af6a3262c6481f7794142a1 (diff)
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 <[email protected]>
-rw-r--r--src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c18
1 files 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;