Mesa (main): radv: emit NOT_EOP for multi indexed draws
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Jul 6 13:33:15 UTC 2021
Module: Mesa
Branch: main
Commit: 00206b1664387effca02f28c0923de2560e6b59f
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=00206b1664387effca02f28c0923de2560e6b59f
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Tue Mar 30 16:17:09 2021 -0400
radv: emit NOT_EOP for multi indexed draws
this is never emitted currently because drawCount is always 1
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11532>
---
src/amd/vulkan/radv_cmd_buffer.c | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 7d4c6acec12..32c8561c8b8 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -5252,14 +5252,18 @@ radv_cs_emit_draw_packet(struct radv_cmd_buffer *cmd_buffer, uint32_t vertex_cou
*/
static void
radv_cs_emit_draw_indexed_packet(struct radv_cmd_buffer *cmd_buffer, uint64_t index_va,
- uint32_t max_index_count, uint32_t index_count)
+ uint32_t max_index_count, uint32_t index_count, bool not_eop)
{
radeon_emit(cmd_buffer->cs, PKT3(PKT3_DRAW_INDEX_2, 4, cmd_buffer->state.predicating));
radeon_emit(cmd_buffer->cs, max_index_count);
radeon_emit(cmd_buffer->cs, index_va);
radeon_emit(cmd_buffer->cs, index_va >> 32);
radeon_emit(cmd_buffer->cs, index_count);
- radeon_emit(cmd_buffer->cs, V_0287F0_DI_SRC_SEL_DMA);
+ /* NOT_EOP allows merging multiple draws into 1 wave, but only user VGPRs
+ * can be changed between draws and GS fast launch must be disabled.
+ * NOT_EOP doesn't work on gfx9 and older.
+ */
+ radeon_emit(cmd_buffer->cs, V_0287F0_DI_SRC_SEL_DMA | S_0287F0_NOT_EOP(not_eop));
}
/* MUST inline this function to avoid massive perf loss in drawoverhead */
@@ -5367,6 +5371,7 @@ radv_emit_draw_packets_indexed(struct radv_cmd_buffer *cmd_buffer,
struct radeon_cmdbuf *cs = cmd_buffer->cs;
const int index_size = radv_get_vgt_index_size(state->index_type);
unsigned i = 0;
+ const bool uses_drawid = state->pipeline->graphics.uses_drawid;
if (vertexOffset) {
radv_emit_userdata_vertex(cmd_buffer, info, *vertexOffset);
@@ -5381,12 +5386,12 @@ radv_emit_draw_packets_indexed(struct radv_cmd_buffer *cmd_buffer,
const uint64_t index_va = state->index_va + draw->firstIndex * index_size;
if (!state->subpass->view_mask) {
- radv_cs_emit_draw_indexed_packet(cmd_buffer, index_va, remaining_indexes, draw->indexCount);
+ radv_cs_emit_draw_indexed_packet(cmd_buffer, index_va, remaining_indexes, draw->indexCount, !uses_drawid && i < drawCount - 1);
} else {
u_foreach_bit(view, state->subpass->view_mask) {
radv_emit_view_index(cmd_buffer, view);
- radv_cs_emit_draw_indexed_packet(cmd_buffer, index_va, remaining_indexes, draw->indexCount);
+ radv_cs_emit_draw_indexed_packet(cmd_buffer, index_va, remaining_indexes, draw->indexCount, false);
}
}
}
@@ -5399,6 +5404,8 @@ radv_emit_draw_packets_indexed(struct radv_cmd_buffer *cmd_buffer,
cmd_buffer->device->physical_device->rad_info.has_zero_index_buffer_bug)
continue;
+ const VkMultiDrawIndexedInfoEXT *next = (void*)(i < drawCount - 1 ? ((uint8_t*)draw + stride) : NULL);
+ const bool offset_changes = next && next->vertexOffset != draw->vertexOffset;
if (i > 0) {
if (state->last_vertex_offset != draw->vertexOffset) {
radeon_set_sh_reg(cs, state->pipeline->graphics.vtx_base_sgpr, draw->vertexOffset);
@@ -5411,12 +5418,12 @@ radv_emit_draw_packets_indexed(struct radv_cmd_buffer *cmd_buffer,
const uint64_t index_va = state->index_va + draw->firstIndex * index_size;
if (!state->subpass->view_mask) {
- radv_cs_emit_draw_indexed_packet(cmd_buffer, index_va, remaining_indexes, draw->indexCount);
+ radv_cs_emit_draw_indexed_packet(cmd_buffer, index_va, remaining_indexes, draw->indexCount, !offset_changes && !uses_drawid && i < drawCount - 1);
} else {
u_foreach_bit(view, state->subpass->view_mask) {
radv_emit_view_index(cmd_buffer, view);
- radv_cs_emit_draw_indexed_packet(cmd_buffer, index_va, remaining_indexes, draw->indexCount);
+ radv_cs_emit_draw_indexed_packet(cmd_buffer, index_va, remaining_indexes, draw->indexCount, false);
}
}
}
More information about the mesa-commit
mailing list