#include "tu_private.h"
-#include "registers/adreno_pm4.xml.h"
+#include "adreno_pm4.xml.h"
void
tu_cs_init(struct tu_cs *cs,
tu_cs_alloc(struct tu_cs *cs,
uint32_t count,
uint32_t size,
- struct ts_cs_memory *memory);
+ struct tu_cs_memory *memory);
struct tu_cs_entry
tu_cs_end_sub_stream(struct tu_cs *cs, struct tu_cs *sub_cs);
+static inline struct tu_draw_state
+tu_cs_end_draw_state(struct tu_cs *cs, struct tu_cs *sub_cs)
+{
+ struct tu_cs_entry entry = tu_cs_end_sub_stream(cs, sub_cs);
+ return (struct tu_draw_state) {
+ .iova = entry.bo->iova + entry.offset,
+ .size = entry.size / sizeof(uint32_t),
+ };
+}
+
VkResult
tu_cs_reserve_space(struct tu_cs *cs, uint32_t reserved_size);
+static inline struct tu_draw_state
+tu_cs_draw_state(struct tu_cs *sub_cs, struct tu_cs *cs, uint32_t size)
+{
+ struct tu_cs_memory memory;
+
+ /* TODO: clean this up */
+ tu_cs_alloc(sub_cs, size, 1, &memory);
+ tu_cs_init_external(cs, memory.map, memory.map + size);
+ tu_cs_begin(cs);
+ tu_cs_reserve_space(cs, size);
+
+ return (struct tu_draw_state) {
+ .iova = memory.iova,
+ .size = size,
+ };
+}
+
void
tu_cs_reset(struct tu_cs *cs);
VkResult
tu_cs_add_entries(struct tu_cs *cs, struct tu_cs *target);
+/**
+ * Get the size of the command packets emitted since the last call to
+ * tu_cs_add_entry.
+ */
+static inline uint32_t
+tu_cs_get_size(const struct tu_cs *cs)
+{
+ return cs->cur - cs->start;
+}
+
+/**
+ * Return true if there is no command packet emitted since the last call to
+ * tu_cs_add_entry.
+ */
+static inline uint32_t
+tu_cs_is_empty(const struct tu_cs *cs)
+{
+ return tu_cs_get_size(cs) == 0;
+}
+
/**
* Discard all entries. This allows \a cs to be reused while keeping the
* existing BOs and command packets intact.
tu_cs_emit(cs, entry->size / sizeof(uint32_t));
}
+/* for compute which isn't using SET_DRAW_STATE */
+static inline void
+tu_cs_emit_state_ib(struct tu_cs *cs, struct tu_draw_state state)
+{
+ if (state.size) {
+ tu_cs_emit_pkt7(cs, CP_INDIRECT_BUFFER, 3);
+ tu_cs_emit_qw(cs, state.iova);
+ tu_cs_emit(cs, state.size);
+ }
+}
+
/**
* Emit a CP_INDIRECT_BUFFER command packet for each entry in the target
* command stream.
STATIC_ASSERT(count > 0); \
STATIC_ASSERT(count <= 16); \
\
- tu_cs_emit_pkt4(cs, regs[0].reg, count); \
- uint32_t *p = cs->cur; \
+ tu_cs_emit_pkt4((cs), regs[0].reg, count); \
+ uint32_t *p = (cs)->cur; \
__ONE_REG( 0, regs); \
__ONE_REG( 1, regs); \
__ONE_REG( 2, regs); \
__ONE_REG(13, regs); \
__ONE_REG(14, regs); \
__ONE_REG(15, regs); \
- cs->cur = p; \
+ (cs)->cur = p; \
} while (0)
#endif /* TU_CS_H */