From 5c63fc626f98def10d20971161e672f9e7cd341c Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Tue, 29 Jan 2019 10:43:48 -0800 Subject: turnip: provide both emit_ib and emit_call tu_cs_emit_ib emits a CP_INDIRECT_BUFFER for a BO. tu_cs_emit_call emits a CP_INDIRECT_BUFFER for each entry of a target cs. --- src/freedreno/vulkan/tu_cs.h | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) (limited to 'src/freedreno/vulkan/tu_cs.h') diff --git a/src/freedreno/vulkan/tu_cs.h b/src/freedreno/vulkan/tu_cs.h index c28d8de76c7..cfac00f200d 100644 --- a/src/freedreno/vulkan/tu_cs.h +++ b/src/freedreno/vulkan/tu_cs.h @@ -47,6 +47,16 @@ tu_cs_reserve_space(struct tu_device *dev, void tu_cs_reset(struct tu_device *dev, struct tu_cs *cs); +/** + * Get the size needed for tu_cs_emit_call. + */ +static inline uint32_t +tu_cs_get_call_size(const struct tu_cs *cs) +{ + /* each CP_INDIRECT_BUFFER needs 4 dwords */ + return cs->entry_count * 4; +} + /** * Assert that we did not exceed the reserved space. */ @@ -124,16 +134,29 @@ tu_cs_emit_write_reg(struct tu_cs *cs, uint16_t reg, uint32_t value) tu_cs_emit(cs, value); } +/** + * Emit a CP_INDIRECT_BUFFER command packet. + */ static inline void -tu_cs_emit_ib(struct tu_cs *cs, const struct tu_cs *target) +tu_cs_emit_ib(struct tu_cs *cs, const struct tu_cs_entry *entry) { - for (uint32_t i = 0; i < target->entry_count; i++) { - const struct tu_cs_entry *entry = target->entries + i; + assert(entry->offset % sizeof(uint32_t) == 0); + assert(entry->size % sizeof(uint32_t) == 0); - tu_cs_emit_pkt7(cs, CP_INDIRECT_BUFFER, 3); - tu_cs_emit_qw(cs, entry->bo->iova + entry->offset); - tu_cs_emit(cs, entry->size / sizeof(uint32_t)); - } + tu_cs_emit_pkt7(cs, CP_INDIRECT_BUFFER, 3); + tu_cs_emit_qw(cs, entry->bo->iova + entry->offset); + tu_cs_emit(cs, entry->size / sizeof(uint32_t)); +} + +/** + * Emit a CP_INDIRECT_BUFFER command packet for each entry in the target + * command stream. + */ +static inline void +tu_cs_emit_call(struct tu_cs *cs, const struct tu_cs *target) +{ + for (uint32_t i = 0; i < target->entry_count; i++) + tu_cs_emit_ib(cs, target->entries + i); } #endif /* TU_CS_H */ -- cgit v1.2.3