tu: Add helper for CP_COND_REG_EXEC

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3713>
This commit is contained in:
Connor Abbott 2020-02-06 16:31:10 +01:00 committed by Jonathan Marek
parent 6a0c4008bf
commit 07e07daeae
1 changed files with 40 additions and 0 deletions

View File

@ -207,6 +207,46 @@ tu_cs_emit_call(struct tu_cs *cs, const struct tu_cs *target)
tu_cs_emit_ib(cs, target->entries + i);
}
/* Helpers for bracketing a large sequence of commands of unknown size inside
* a CP_COND_REG_EXEC packet.
*/
struct tu_cond_exec_state {
uint32_t *dword_ptr;
uint32_t max_dwords;
};
static inline VkResult
tu_cond_exec_start(struct tu_device *dev, struct tu_cs *cs,
struct tu_cond_exec_state *state,
uint32_t condition, uint32_t max_dwords)
{
/* Reserve enough space so that both the condition packet and the actual
* condition will fit in the same IB.
*/
VkResult result = tu_cs_reserve_space(dev, cs, max_dwords + 3);
if (result != VK_SUCCESS)
return result;
state->max_dwords = max_dwords;
tu_cs_emit_pkt7(cs, CP_COND_REG_EXEC, 2);
tu_cs_emit(cs, condition);
state->dword_ptr = cs->cur;
/* Emit dummy DWORD field here */
tu_cs_emit(cs, CP_COND_REG_EXEC_1_DWORDS(0));
return VK_SUCCESS;
}
static inline void
tu_cond_exec_end(struct tu_cs *cs, struct tu_cond_exec_state *state)
{
/* Subtract one here to account for the DWORD field itself. */
uint32_t actual_dwords = cs->cur - state->dword_ptr - 1;
assert(actual_dwords <= state->max_dwords);
*state->dword_ptr = actual_dwords;
}
#define fd_reg_pair tu_reg_value
#define __bo_type struct tu_bo *