turnip: add tu_cs_reserve_space(_assert)
authorChia-I Wu <olvaffe@gmail.com>
Fri, 18 Jan 2019 22:24:45 +0000 (14:24 -0800)
committerChia-I Wu <olvaffe@gmail.com>
Mon, 11 Mar 2019 17:01:41 +0000 (10:01 -0700)
They are used like

 tu_cs_reserve_space(...);
 tu_cs_emit(...);
 ...;
 tu_cs_reserve_space_assert();

to make sure we reserved enough space at the beginning.

src/freedreno/vulkan/tu_cs.c
src/freedreno/vulkan/tu_cs.h
src/freedreno/vulkan/tu_private.h

index efc38b1775723ac3f9b6e4b81d5c8fab106ad92c..ffb1dc4f10f16af6a68c8a2ddbcefd0660f44662 100644 (file)
@@ -117,6 +117,8 @@ tu_cs_begin(struct tu_device *dev, struct tu_cs *cs, uint32_t reserve_size)
          return result;
    }
 
+   assert(cs->end - cs->cur >= reserve_size);
+
    return VK_SUCCESS;
 }
 
index 94d9bf7cddeba4074cb24b16f237655adfd28ebb..a26b01b0ca2c4ff3202c86e51c0727daccbd7d63 100644 (file)
@@ -42,16 +42,34 @@ tu_cs_reset(struct tu_device *dev, struct tu_cs *cs);
  * Reserve space from a command stream for \a size uint32_t values.
  */
 static inline VkResult
-tu_cs_check_space(struct tu_device *dev, struct tu_cs *cs, size_t size)
+tu_cs_reserve_space(struct tu_device *dev, struct tu_cs *cs, size_t size)
 {
-   if (cs->end - cs->cur >= size)
+   if (cs->end - cs->cur >= size) {
+      cs->reserved_end = cs->cur + size;
       return VK_SUCCESS;
+   }
 
    VkResult result = tu_cs_end(cs);
    if (result != VK_SUCCESS)
       return result;
 
-   return tu_cs_begin(dev, cs, size);
+   result = tu_cs_begin(dev, cs, size);
+   if (result != VK_SUCCESS)
+      return result;
+
+   cs->reserved_end = cs->cur + size;
+   assert(cs->reserved_end <= cs->end);
+
+   return VK_SUCCESS;
+}
+
+/**
+ * Assert that we did not exceed the reserved space.
+ */
+static inline void
+tu_cs_reserve_space_assert(struct tu_cs *cs)
+{
+   assert(cs->cur <= cs->reserved_end);
 }
 
 /**
index c52aaa34cd29b6f4729630b485e2b2f6177e1d60..4b985d8ca69ad912d8fbca982d1eae7f1c9a9df7 100644 (file)
@@ -747,6 +747,9 @@ struct tu_cs
    uint32_t *cur;
    uint32_t *end;
 
+   /* for tu_cs_reserve_space_assert */
+   uint32_t *reserved_end;
+
    struct tu_cs_entry *entries;
    uint32_t entry_count;
    uint32_t entry_capacity;