venus: flush when batched draw calls reach a threshold
Add VN_DRAW_CMD_BATCH_LIMIT option e.g. for Android adb shell setprop mesa.vn.draw.cmd.batch.limit 100 Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16110>
This commit is contained in:
parent
9dc68bd975
commit
1598d18a88
|
@ -617,6 +617,7 @@ vn_ResetCommandBuffer(VkCommandBuffer commandBuffer,
|
|||
|
||||
vn_cs_encoder_reset(&cmd->cs);
|
||||
cmd->state = VN_COMMAND_BUFFER_STATE_INITIAL;
|
||||
cmd->draw_cmd_batched = 0;
|
||||
|
||||
vn_async_vkResetCommandBuffer(cmd->device->instance, commandBuffer, flags);
|
||||
|
||||
|
@ -634,6 +635,7 @@ vn_BeginCommandBuffer(VkCommandBuffer commandBuffer,
|
|||
size_t cmd_size;
|
||||
|
||||
vn_cs_encoder_reset(&cmd->cs);
|
||||
cmd->draw_cmd_batched = 0;
|
||||
|
||||
/* TODO: add support for VK_KHR_dynamic_rendering */
|
||||
VkCommandBufferBeginInfo local_begin_info;
|
||||
|
@ -702,6 +704,14 @@ vn_cmd_submit(struct vn_command_buffer *cmd)
|
|||
}
|
||||
|
||||
vn_cs_encoder_reset(&cmd->cs);
|
||||
cmd->draw_cmd_batched = 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
vn_cmd_count_draw_and_submit_on_batch_limit(struct vn_command_buffer *cmd)
|
||||
{
|
||||
if (++cmd->draw_cmd_batched >= vn_env.draw_cmd_batch_limit)
|
||||
vn_cmd_submit(cmd);
|
||||
}
|
||||
|
||||
VkResult
|
||||
|
@ -866,6 +876,9 @@ vn_CmdDraw(VkCommandBuffer commandBuffer,
|
|||
{
|
||||
VN_CMD_ENQUEUE(vkCmdDraw, commandBuffer, vertexCount, instanceCount,
|
||||
firstVertex, firstInstance);
|
||||
|
||||
vn_cmd_count_draw_and_submit_on_batch_limit(
|
||||
vn_command_buffer_from_handle(commandBuffer));
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -878,6 +891,9 @@ vn_CmdDrawIndexed(VkCommandBuffer commandBuffer,
|
|||
{
|
||||
VN_CMD_ENQUEUE(vkCmdDrawIndexed, commandBuffer, indexCount, instanceCount,
|
||||
firstIndex, vertexOffset, firstInstance);
|
||||
|
||||
vn_cmd_count_draw_and_submit_on_batch_limit(
|
||||
vn_command_buffer_from_handle(commandBuffer));
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -889,6 +905,9 @@ vn_CmdDrawIndirect(VkCommandBuffer commandBuffer,
|
|||
{
|
||||
VN_CMD_ENQUEUE(vkCmdDrawIndirect, commandBuffer, buffer, offset, drawCount,
|
||||
stride);
|
||||
|
||||
vn_cmd_count_draw_and_submit_on_batch_limit(
|
||||
vn_command_buffer_from_handle(commandBuffer));
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -900,6 +919,9 @@ vn_CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer,
|
|||
{
|
||||
VN_CMD_ENQUEUE(vkCmdDrawIndexedIndirect, commandBuffer, buffer, offset,
|
||||
drawCount, stride);
|
||||
|
||||
vn_cmd_count_draw_and_submit_on_batch_limit(
|
||||
vn_command_buffer_from_handle(commandBuffer));
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -913,6 +935,9 @@ vn_CmdDrawIndirectCount(VkCommandBuffer commandBuffer,
|
|||
{
|
||||
VN_CMD_ENQUEUE(vkCmdDrawIndirectCount, commandBuffer, buffer, offset,
|
||||
countBuffer, countBufferOffset, maxDrawCount, stride);
|
||||
|
||||
vn_cmd_count_draw_and_submit_on_batch_limit(
|
||||
vn_command_buffer_from_handle(commandBuffer));
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -927,6 +952,9 @@ vn_CmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer,
|
|||
VN_CMD_ENQUEUE(vkCmdDrawIndexedIndirectCount, commandBuffer, buffer,
|
||||
offset, countBuffer, countBufferOffset, maxDrawCount,
|
||||
stride);
|
||||
|
||||
vn_cmd_count_draw_and_submit_on_batch_limit(
|
||||
vn_command_buffer_from_handle(commandBuffer));
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1424,6 +1452,9 @@ vn_CmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer,
|
|||
VN_CMD_ENQUEUE(vkCmdDrawIndirectByteCountEXT, commandBuffer, instanceCount,
|
||||
firstInstance, counterBuffer, counterBufferOffset,
|
||||
counterOffset, vertexStride);
|
||||
|
||||
vn_cmd_count_draw_and_submit_on_batch_limit(
|
||||
vn_command_buffer_from_handle(commandBuffer));
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -60,6 +60,8 @@ struct vn_command_buffer {
|
|||
|
||||
enum vn_command_buffer_state state;
|
||||
struct vn_cs_encoder cs;
|
||||
|
||||
uint32_t draw_cmd_batched;
|
||||
};
|
||||
VK_DEFINE_HANDLE_CASTS(vn_command_buffer,
|
||||
base.base,
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include "util/debug.h"
|
||||
#include "util/log.h"
|
||||
#include "util/os_misc.h"
|
||||
#include "util/u_debug.h"
|
||||
#include "venus-protocol/vn_protocol_driver_info.h"
|
||||
#include "vk_enum_to_str.h"
|
||||
|
||||
|
@ -43,6 +44,10 @@ vn_env_init_once(void)
|
|||
parse_debug_string(os_get_option("VN_DEBUG"), vn_debug_options);
|
||||
vn_env.perf =
|
||||
parse_debug_string(os_get_option("VN_PERF"), vn_perf_options);
|
||||
vn_env.draw_cmd_batch_limit =
|
||||
debug_get_num_option("VN_DRAW_CMD_BATCH_LIMIT", UINT32_MAX);
|
||||
if (!vn_env.draw_cmd_batch_limit)
|
||||
vn_env.draw_cmd_batch_limit = UINT32_MAX;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -181,6 +181,8 @@ struct vn_refcount {
|
|||
struct vn_env {
|
||||
uint64_t debug;
|
||||
uint64_t perf;
|
||||
/* zero will be overridden to UINT32_MAX as no limit */
|
||||
uint32_t draw_cmd_batch_limit;
|
||||
};
|
||||
extern struct vn_env vn_env;
|
||||
|
||||
|
|
Loading…
Reference in New Issue