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:
Yiwei Zhang 2022-04-26 19:25:54 +00:00 committed by Marge Bot
parent 9dc68bd975
commit 1598d18a88
4 changed files with 40 additions and 0 deletions

View File

@ -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

View File

@ -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,

View File

@ -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

View File

@ -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;