radv/winsys: Fail early on overgrown cs.
authorGustaw Smolarczyk <wielkiegie@gmail.com>
Thu, 13 Oct 2016 20:54:12 +0000 (22:54 +0200)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Sun, 16 Oct 2016 10:38:53 +0000 (12:38 +0200)
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 <bas@basnieuwenhuizen.nl>
src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c

index 41dfcd323e246abac631c0c115198997b4a7ddce..b8558fafc02c78f5adceb3d2f7e08ed7f7ffc3f3 100644 (file)
@@ -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;