anv: implement generated (indexed) indirect draws
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Rohan Garg <rohan.garg@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15642>
This commit is contained in:
committed by
Marge Bot
parent
3596a8ea7a
commit
c950fe97a0
@@ -3413,6 +3413,11 @@ genX(cmd_buffer_flush_gfx_state)(struct anv_cmd_buffer *cmd_buffer)
|
||||
genX(cmd_buffer_flush_dynamic_state)(cmd_buffer);
|
||||
}
|
||||
|
||||
#define GFX_HAS_GENERATED_CMDS GFX_VER >= 11
|
||||
#if GFX_VER >= 11
|
||||
#include "genX_cmd_draw_generated_indirect.h"
|
||||
#endif
|
||||
|
||||
VkResult
|
||||
genX(BeginCommandBuffer)(
|
||||
VkCommandBuffer commandBuffer,
|
||||
@@ -3618,6 +3623,10 @@ genX(EndCommandBuffer)(
|
||||
|
||||
anv_measure_endcommandbuffer(cmd_buffer);
|
||||
|
||||
#if GFX_HAS_GENERATED_CMDS
|
||||
genX(cmd_buffer_flush_generated_draws)(cmd_buffer);
|
||||
#endif
|
||||
|
||||
/* We want every command buffer to start with the PMA fix in a known state,
|
||||
* so we disable it at the end of the command buffer.
|
||||
*/
|
||||
@@ -3657,6 +3666,10 @@ genX(CmdExecuteCommands)(
|
||||
*/
|
||||
genX(cmd_buffer_apply_pipe_flushes)(primary);
|
||||
|
||||
#if GFX_HAS_GENERATED_CMDS
|
||||
genX(cmd_buffer_flush_generated_draws)(primary);
|
||||
#endif
|
||||
|
||||
for (uint32_t i = 0; i < commandBufferCount; i++) {
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, secondary, pCmdBuffers[i]);
|
||||
|
||||
@@ -3819,6 +3832,11 @@ cmd_buffer_barrier(struct anv_cmd_buffer *cmd_buffer,
|
||||
anv_pipe_flush_bits_for_access_flags(cmd_buffer->device, src_flags) |
|
||||
anv_pipe_invalidate_bits_for_access_flags(cmd_buffer->device, dst_flags);
|
||||
|
||||
#if GFX_HAS_GENERATED_CMDS
|
||||
if (dst_flags & VK_ACCESS_INDIRECT_COMMAND_READ_BIT)
|
||||
genX(cmd_buffer_flush_generated_draws)(cmd_buffer);
|
||||
#endif
|
||||
|
||||
anv_add_pending_pipe_bits(cmd_buffer, bits, reason);
|
||||
}
|
||||
|
||||
@@ -4442,9 +4460,24 @@ void genX(CmdDrawIndirect)(
|
||||
drawCount);
|
||||
trace_intel_begin_draw_indirect(&cmd_buffer->trace);
|
||||
|
||||
#if GFX_HAS_GENERATED_CMDS
|
||||
if (anv_use_generated_draws(cmd_buffer->device, drawCount)) {
|
||||
genX(cmd_buffer_emit_indirect_generated_draws)(
|
||||
cmd_buffer,
|
||||
anv_address_add(buffer->address, offset),
|
||||
MAX2(stride, sizeof(VkDrawIndirectCommand)),
|
||||
drawCount,
|
||||
false /* indexed */);
|
||||
} else {
|
||||
emit_indirect_draws(cmd_buffer,
|
||||
anv_address_add(buffer->address, offset),
|
||||
stride, drawCount, false /* indexed */);
|
||||
}
|
||||
#else
|
||||
emit_indirect_draws(cmd_buffer,
|
||||
anv_address_add(buffer->address, offset),
|
||||
stride, drawCount, false /* indexed */);
|
||||
#endif
|
||||
|
||||
trace_intel_end_draw_indirect(&cmd_buffer->trace, drawCount);
|
||||
}
|
||||
@@ -4468,9 +4501,24 @@ void genX(CmdDrawIndexedIndirect)(
|
||||
drawCount);
|
||||
trace_intel_begin_draw_indexed_indirect(&cmd_buffer->trace);
|
||||
|
||||
#if GFX_HAS_GENERATED_CMDS
|
||||
if (anv_use_generated_draws(cmd_buffer->device, drawCount)) {
|
||||
genX(cmd_buffer_emit_indirect_generated_draws)(
|
||||
cmd_buffer,
|
||||
anv_address_add(buffer->address, offset),
|
||||
MAX2(stride, sizeof(VkDrawIndexedIndirectCommand)),
|
||||
drawCount,
|
||||
true /* indexed */);
|
||||
} else {
|
||||
emit_indirect_draws(cmd_buffer,
|
||||
anv_address_add(buffer->address, offset),
|
||||
stride, drawCount, true /* indexed */);
|
||||
}
|
||||
#else
|
||||
emit_indirect_draws(cmd_buffer,
|
||||
anv_address_add(buffer->address, offset),
|
||||
stride, drawCount, true /* indexed */);
|
||||
#endif
|
||||
|
||||
trace_intel_end_draw_indexed_indirect(&cmd_buffer->trace, drawCount);
|
||||
}
|
||||
@@ -4643,12 +4691,37 @@ void genX(CmdDrawIndirectCount)(
|
||||
0);
|
||||
trace_intel_begin_draw_indirect_count(&cmd_buffer->trace);
|
||||
|
||||
struct anv_address indirect_data_address =
|
||||
anv_address_add(buffer->address, offset);
|
||||
struct anv_address count_address =
|
||||
anv_address_add(count_buffer->address, countBufferOffset);
|
||||
stride = MAX2(stride, sizeof(VkDrawIndirectCommand));
|
||||
|
||||
#if GFX_HAS_GENERATED_CMDS
|
||||
if (anv_use_generated_draws(cmd_buffer->device, maxDrawCount)) {
|
||||
genX(cmd_buffer_emit_indirect_generated_draws_count)(
|
||||
cmd_buffer,
|
||||
indirect_data_address,
|
||||
stride,
|
||||
count_address,
|
||||
maxDrawCount,
|
||||
false /* indexed */);
|
||||
} else {
|
||||
emit_indirect_count_draws(cmd_buffer,
|
||||
indirect_data_address,
|
||||
stride,
|
||||
count_address,
|
||||
maxDrawCount,
|
||||
false /* indexed */);
|
||||
}
|
||||
#else
|
||||
emit_indirect_count_draws(cmd_buffer,
|
||||
anv_address_add(buffer->address, offset),
|
||||
MAX2(stride, sizeof(VkDrawIndirectCommand)),
|
||||
anv_address_add(count_buffer->address, countBufferOffset),
|
||||
indirect_data_address,
|
||||
stride,
|
||||
count_address,
|
||||
maxDrawCount,
|
||||
false /* indexed */);
|
||||
#endif
|
||||
|
||||
trace_intel_end_draw_indirect_count(&cmd_buffer->trace, maxDrawCount);
|
||||
}
|
||||
@@ -4675,12 +4748,37 @@ void genX(CmdDrawIndexedIndirectCount)(
|
||||
0);
|
||||
trace_intel_begin_draw_indexed_indirect_count(&cmd_buffer->trace);
|
||||
|
||||
struct anv_address indirect_data_address =
|
||||
anv_address_add(buffer->address, offset);
|
||||
struct anv_address count_address =
|
||||
anv_address_add(count_buffer->address, countBufferOffset);
|
||||
stride = MAX2(stride, sizeof(VkDrawIndexedIndirectCommand));
|
||||
|
||||
#if GFX_HAS_GENERATED_CMDS
|
||||
if (anv_use_generated_draws(cmd_buffer->device, maxDrawCount)) {
|
||||
genX(cmd_buffer_emit_indirect_generated_draws_count)(
|
||||
cmd_buffer,
|
||||
indirect_data_address,
|
||||
stride,
|
||||
count_address,
|
||||
maxDrawCount,
|
||||
true /* indexed */);
|
||||
} else {
|
||||
emit_indirect_count_draws(cmd_buffer,
|
||||
indirect_data_address,
|
||||
stride,
|
||||
count_address,
|
||||
maxDrawCount,
|
||||
true /* indexed */);
|
||||
}
|
||||
#else
|
||||
emit_indirect_count_draws(cmd_buffer,
|
||||
anv_address_add(buffer->address, offset),
|
||||
MAX2(stride, sizeof(VkDrawIndirectCommand)),
|
||||
anv_address_add(count_buffer->address, countBufferOffset),
|
||||
indirect_data_address,
|
||||
stride,
|
||||
count_address,
|
||||
maxDrawCount,
|
||||
true /* indexed */);
|
||||
#endif
|
||||
|
||||
trace_intel_end_draw_indexed_indirect_count(&cmd_buffer->trace, maxDrawCount);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user