turnip: Fix execution of secondary cmd bufs with nothing in primary.
authorEric Anholt <eric@anholt.net>
Wed, 22 Jan 2020 21:19:32 +0000 (13:19 -0800)
committerMarge Bot <eric+marge@anholt.net>
Thu, 23 Jan 2020 20:27:26 +0000 (20:27 +0000)
We want to finish off cmd emission in the primary CS and add its entry to
the IB, but regardless of whether there had been anything in the primary
CS to emit, we still need a reserved CS entry for the loop below.

Fixes crashes in dEQP-VK.binding_model.shader_access.secondary_cmd_buf.*
and many more in dEQP-VK.renderpass*

Reviewed-by: Jonathan Marek <jonathan@marek.ca>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3524>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3524>

src/freedreno/vulkan/tu_cs.c

index 18c942ec3ab2ce5006960443381ecaf5e4b3beee..4e7ea2b5022c2d80574c9e5cace2342f284ec989 100644 (file)
@@ -220,18 +220,14 @@ tu_cs_add_entries(struct tu_cs *cs, struct tu_cs *target)
    assert(cs->mode == TU_CS_MODE_GROW);
    assert(target->mode == TU_CS_MODE_GROW);
 
-   if (!tu_cs_is_empty(cs)) {
+   if (!tu_cs_is_empty(cs))
       tu_cs_add_entry(cs);
-      result = tu_cs_reserve_entry(cs);
-      if (result != VK_SUCCESS)
-         return result;
-   }
 
    for (unsigned i = 0; i < target->entry_count; i++) {
-      cs->entries[cs->entry_count++] = target->entries[i];
       result = tu_cs_reserve_entry(cs);
       if (result != VK_SUCCESS)
          return result;
+      cs->entries[cs->entry_count++] = target->entries[i];
    }
 
    return VK_SUCCESS;