radv: add a mask of bound descriptor buffers for dynamic vertex input

unnecessarily dereferencing the vertex buffer info array here causes a
ton of cpu overhead due to bad cache locality, so just use a mask to
avoid loading X more cachelines into memory unnecessarily

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13320>
This commit is contained in:
Mike Blumenkrantz 2021-09-08 15:10:29 -04:00 committed by Marge Bot
parent eda5634e25
commit 1b8bdecf6e
2 changed files with 10 additions and 6 deletions

View file

@ -4446,7 +4446,9 @@ radv_CmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBindi
const uint32_t bit = 1u << idx;
if (!buffer) {
cmd_buffer->state.vbo_misaligned_mask &= ~bit;
cmd_buffer->state.vbo_bound_mask &= ~bit;
} else {
cmd_buffer->state.vbo_bound_mask |= bit;
if (pStrides && vb[idx].stride != stride) {
if (stride & state->format_align_req_minus_1[idx])
cmd_buffer->state.vbo_misaligned_mask |= bit;
@ -5483,15 +5485,16 @@ radv_CmdSetVertexInputEXT(VkCommandBuffer commandBuffer, uint32_t vertexBindingD
if (chip == GFX6 || chip >= GFX10) {
struct radv_vertex_binding *vb = cmd_buffer->vertex_bindings;
unsigned bit = 1u << loc;
if (binding->stride & format_align_req_minus_1) {
state->misaligned_mask |= 1u << loc;
if (vb[attrib->binding].buffer)
cmd_buffer->state.vbo_misaligned_mask |= 1u << loc;
state->misaligned_mask |= bit;
if (cmd_buffer->state.vbo_bound_mask & bit)
cmd_buffer->state.vbo_misaligned_mask |= bit;
} else {
state->possibly_misaligned_mask |= 1u << loc;
if (vb[attrib->binding].buffer &&
state->possibly_misaligned_mask |= bit;
if (cmd_buffer->state.vbo_bound_mask & bit &&
((vb[attrib->binding].offset + state->offsets[loc]) & format_align_req_minus_1))
cmd_buffer->state.vbo_misaligned_mask |= 1u << loc;
cmd_buffer->state.vbo_misaligned_mask |= bit;
}
}

View file

@ -1432,6 +1432,7 @@ struct radv_cmd_state {
uint32_t *emitted_vs_prolog_key;
uint32_t emitted_vs_prolog_key_hash;
uint32_t vbo_misaligned_mask;
uint32_t vbo_bound_mask;
};
struct radv_cmd_pool {