diff options
author | Danylo Piliaiev <dpiliaiev@igalia.com> | 2022-04-13 20:37:38 +0300 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2022-06-07 00:00:28 +0000 |
commit | ecabd3b5a9a122c3c125d4ace2aacc44517737cf (patch) | |
tree | 0f16aab36c1b823d0baedef38cb4ae0366e34b35 | |
parent | a92fad45e9580bacc070843b158bc1ac6f7ce647 (diff) |
turnip: Allow nested CP_COND_REG_EXEC
This ends up being needed for moving tile loads into the draw cs.
Signed-off-by: Danylo Piliaiev <dpiliaiev@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16826>
-rw-r--r-- | src/freedreno/vulkan/tu_cmd_buffer.c | 2 | ||||
-rw-r--r-- | src/freedreno/vulkan/tu_cs.c | 14 | ||||
-rw-r--r-- | src/freedreno/vulkan/tu_cs.h | 16 | ||||
-rw-r--r-- | src/freedreno/vulkan/tu_private.h | 7 |
4 files changed, 24 insertions, 15 deletions
diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c index 8945bbf7681..93fab52fda8 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.c +++ b/src/freedreno/vulkan/tu_cmd_buffer.c @@ -160,7 +160,7 @@ tu_emit_cache_flush_ccu(struct tu_cmd_buffer *cmd_buffer, assert(ccu_state != TU_CMD_CCU_UNKNOWN); /* It's unsafe to flush inside condition because we clear flush_bits */ - assert(!cs->cond_flags); + assert(!cs->cond_stack_depth); /* Changing CCU state must involve invalidating the CCU. In sysmem mode, * the CCU may also contain data that we haven't flushed out yet, so we diff --git a/src/freedreno/vulkan/tu_cs.c b/src/freedreno/vulkan/tu_cs.c index 73b80758ca9..1ff85734c04 100644 --- a/src/freedreno/vulkan/tu_cs.c +++ b/src/freedreno/vulkan/tu_cs.c @@ -376,9 +376,9 @@ tu_cs_reserve_space(struct tu_cs *cs, uint32_t reserved_size) tu_cs_add_entry(cs); } - if (cs->cond_flags) { + for (uint32_t i = 0; i < cs->cond_stack_depth; i++) { /* Subtract one here to account for the DWORD field itself. */ - *cs->cond_dwords = cs->cur - cs->cond_dwords - 1; + *cs->cond_dwords[i] = cs->cur - cs->cond_dwords[i] - 1; /* space for CP_COND_REG_EXEC in next bo */ reserved_size += 3; @@ -390,14 +390,16 @@ tu_cs_reserve_space(struct tu_cs *cs, uint32_t reserved_size) if (result != VK_SUCCESS) return result; - /* if inside a condition, emit a new CP_COND_REG_EXEC */ - if (cs->cond_flags) { + if (cs->cond_stack_depth) { cs->reserved_end = cs->cur + reserved_size; + } + /* Re-emit CP_COND_REG_EXECs */ + for (uint32_t i = 0; i < cs->cond_stack_depth; i++) { tu_cs_emit_pkt7(cs, CP_COND_REG_EXEC, 2); - tu_cs_emit(cs, cs->cond_flags); + tu_cs_emit(cs, cs->cond_flags[i]); - cs->cond_dwords = cs->cur; + cs->cond_dwords[i] = cs->cur; /* Emit dummy DWORD field here */ tu_cs_emit(cs, CP_COND_REG_EXEC_1_DWORDS(0)); diff --git a/src/freedreno/vulkan/tu_cs.h b/src/freedreno/vulkan/tu_cs.h index 1a01f76a8cf..892c37a3294 100644 --- a/src/freedreno/vulkan/tu_cs.h +++ b/src/freedreno/vulkan/tu_cs.h @@ -290,16 +290,18 @@ static inline void tu_cond_exec_start(struct tu_cs *cs, uint32_t cond_flags) { assert(cs->mode == TU_CS_MODE_GROW); - assert(!cs->cond_flags && cond_flags); + assert(cs->cond_stack_depth < TU_COND_EXEC_STACK_SIZE); tu_cs_emit_pkt7(cs, CP_COND_REG_EXEC, 2); tu_cs_emit(cs, cond_flags); - cs->cond_flags = cond_flags; - cs->cond_dwords = cs->cur; + cs->cond_flags[cs->cond_stack_depth] = cond_flags; + cs->cond_dwords[cs->cond_stack_depth] = cs->cur; /* Emit dummy DWORD field here */ tu_cs_emit(cs, CP_COND_REG_EXEC_1_DWORDS(0)); + + cs->cond_stack_depth++; } #define CP_COND_EXEC_0_RENDER_MODE_GMEM \ (CP_COND_REG_EXEC_0_MODE(RENDER_MODE) | CP_COND_REG_EXEC_0_GMEM) @@ -309,11 +311,13 @@ tu_cond_exec_start(struct tu_cs *cs, uint32_t cond_flags) static inline void tu_cond_exec_end(struct tu_cs *cs) { - assert(cs->cond_flags); + assert(cs->cond_stack_depth > 0); + cs->cond_stack_depth--; - cs->cond_flags = 0; + cs->cond_flags[cs->cond_stack_depth] = 0; /* Subtract one here to account for the DWORD field itself. */ - *cs->cond_dwords = cs->cur - cs->cond_dwords - 1; + *cs->cond_dwords[cs->cond_stack_depth] = + cs->cur - cs->cond_dwords[cs->cond_stack_depth] - 1; } #define fd_reg_pair tu_reg_value diff --git a/src/freedreno/vulkan/tu_private.h b/src/freedreno/vulkan/tu_private.h index 0fca4120d8e..2ad2d6e6511 100644 --- a/src/freedreno/vulkan/tu_private.h +++ b/src/freedreno/vulkan/tu_private.h @@ -764,6 +764,8 @@ enum tu_cs_mode TU_CS_MODE_SUB_STREAM, }; +#define TU_COND_EXEC_STACK_SIZE 4 + struct tu_cs { uint32_t *start; @@ -787,8 +789,9 @@ struct tu_cs struct tu_bo *refcount_bo; /* state for cond_exec_start/cond_exec_end */ - uint32_t cond_flags; - uint32_t *cond_dwords; + uint32_t cond_stack_depth; + uint32_t cond_flags[TU_COND_EXEC_STACK_SIZE]; + uint32_t *cond_dwords[TU_COND_EXEC_STACK_SIZE]; }; struct tu_device_memory |