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);
|
vn_cs_encoder_reset(&cmd->cs);
|
||||||
cmd->state = VN_COMMAND_BUFFER_STATE_INITIAL;
|
cmd->state = VN_COMMAND_BUFFER_STATE_INITIAL;
|
||||||
|
cmd->draw_cmd_batched = 0;
|
||||||
|
|
||||||
vn_async_vkResetCommandBuffer(cmd->device->instance, commandBuffer, flags);
|
vn_async_vkResetCommandBuffer(cmd->device->instance, commandBuffer, flags);
|
||||||
|
|
||||||
|
@ -634,6 +635,7 @@ vn_BeginCommandBuffer(VkCommandBuffer commandBuffer,
|
||||||
size_t cmd_size;
|
size_t cmd_size;
|
||||||
|
|
||||||
vn_cs_encoder_reset(&cmd->cs);
|
vn_cs_encoder_reset(&cmd->cs);
|
||||||
|
cmd->draw_cmd_batched = 0;
|
||||||
|
|
||||||
/* TODO: add support for VK_KHR_dynamic_rendering */
|
/* TODO: add support for VK_KHR_dynamic_rendering */
|
||||||
VkCommandBufferBeginInfo local_begin_info;
|
VkCommandBufferBeginInfo local_begin_info;
|
||||||
|
@ -702,6 +704,14 @@ vn_cmd_submit(struct vn_command_buffer *cmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
vn_cs_encoder_reset(&cmd->cs);
|
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
|
VkResult
|
||||||
|
@ -866,6 +876,9 @@ vn_CmdDraw(VkCommandBuffer commandBuffer,
|
||||||
{
|
{
|
||||||
VN_CMD_ENQUEUE(vkCmdDraw, commandBuffer, vertexCount, instanceCount,
|
VN_CMD_ENQUEUE(vkCmdDraw, commandBuffer, vertexCount, instanceCount,
|
||||||
firstVertex, firstInstance);
|
firstVertex, firstInstance);
|
||||||
|
|
||||||
|
vn_cmd_count_draw_and_submit_on_batch_limit(
|
||||||
|
vn_command_buffer_from_handle(commandBuffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -878,6 +891,9 @@ vn_CmdDrawIndexed(VkCommandBuffer commandBuffer,
|
||||||
{
|
{
|
||||||
VN_CMD_ENQUEUE(vkCmdDrawIndexed, commandBuffer, indexCount, instanceCount,
|
VN_CMD_ENQUEUE(vkCmdDrawIndexed, commandBuffer, indexCount, instanceCount,
|
||||||
firstIndex, vertexOffset, firstInstance);
|
firstIndex, vertexOffset, firstInstance);
|
||||||
|
|
||||||
|
vn_cmd_count_draw_and_submit_on_batch_limit(
|
||||||
|
vn_command_buffer_from_handle(commandBuffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -889,6 +905,9 @@ vn_CmdDrawIndirect(VkCommandBuffer commandBuffer,
|
||||||
{
|
{
|
||||||
VN_CMD_ENQUEUE(vkCmdDrawIndirect, commandBuffer, buffer, offset, drawCount,
|
VN_CMD_ENQUEUE(vkCmdDrawIndirect, commandBuffer, buffer, offset, drawCount,
|
||||||
stride);
|
stride);
|
||||||
|
|
||||||
|
vn_cmd_count_draw_and_submit_on_batch_limit(
|
||||||
|
vn_command_buffer_from_handle(commandBuffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -900,6 +919,9 @@ vn_CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer,
|
||||||
{
|
{
|
||||||
VN_CMD_ENQUEUE(vkCmdDrawIndexedIndirect, commandBuffer, buffer, offset,
|
VN_CMD_ENQUEUE(vkCmdDrawIndexedIndirect, commandBuffer, buffer, offset,
|
||||||
drawCount, stride);
|
drawCount, stride);
|
||||||
|
|
||||||
|
vn_cmd_count_draw_and_submit_on_batch_limit(
|
||||||
|
vn_command_buffer_from_handle(commandBuffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -913,6 +935,9 @@ vn_CmdDrawIndirectCount(VkCommandBuffer commandBuffer,
|
||||||
{
|
{
|
||||||
VN_CMD_ENQUEUE(vkCmdDrawIndirectCount, commandBuffer, buffer, offset,
|
VN_CMD_ENQUEUE(vkCmdDrawIndirectCount, commandBuffer, buffer, offset,
|
||||||
countBuffer, countBufferOffset, maxDrawCount, stride);
|
countBuffer, countBufferOffset, maxDrawCount, stride);
|
||||||
|
|
||||||
|
vn_cmd_count_draw_and_submit_on_batch_limit(
|
||||||
|
vn_command_buffer_from_handle(commandBuffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -927,6 +952,9 @@ vn_CmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer,
|
||||||
VN_CMD_ENQUEUE(vkCmdDrawIndexedIndirectCount, commandBuffer, buffer,
|
VN_CMD_ENQUEUE(vkCmdDrawIndexedIndirectCount, commandBuffer, buffer,
|
||||||
offset, countBuffer, countBufferOffset, maxDrawCount,
|
offset, countBuffer, countBufferOffset, maxDrawCount,
|
||||||
stride);
|
stride);
|
||||||
|
|
||||||
|
vn_cmd_count_draw_and_submit_on_batch_limit(
|
||||||
|
vn_command_buffer_from_handle(commandBuffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1424,6 +1452,9 @@ vn_CmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer,
|
||||||
VN_CMD_ENQUEUE(vkCmdDrawIndirectByteCountEXT, commandBuffer, instanceCount,
|
VN_CMD_ENQUEUE(vkCmdDrawIndirectByteCountEXT, commandBuffer, instanceCount,
|
||||||
firstInstance, counterBuffer, counterBufferOffset,
|
firstInstance, counterBuffer, counterBufferOffset,
|
||||||
counterOffset, vertexStride);
|
counterOffset, vertexStride);
|
||||||
|
|
||||||
|
vn_cmd_count_draw_and_submit_on_batch_limit(
|
||||||
|
vn_command_buffer_from_handle(commandBuffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -60,6 +60,8 @@ struct vn_command_buffer {
|
||||||
|
|
||||||
enum vn_command_buffer_state state;
|
enum vn_command_buffer_state state;
|
||||||
struct vn_cs_encoder cs;
|
struct vn_cs_encoder cs;
|
||||||
|
|
||||||
|
uint32_t draw_cmd_batched;
|
||||||
};
|
};
|
||||||
VK_DEFINE_HANDLE_CASTS(vn_command_buffer,
|
VK_DEFINE_HANDLE_CASTS(vn_command_buffer,
|
||||||
base.base,
|
base.base,
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include "util/debug.h"
|
#include "util/debug.h"
|
||||||
#include "util/log.h"
|
#include "util/log.h"
|
||||||
#include "util/os_misc.h"
|
#include "util/os_misc.h"
|
||||||
|
#include "util/u_debug.h"
|
||||||
#include "venus-protocol/vn_protocol_driver_info.h"
|
#include "venus-protocol/vn_protocol_driver_info.h"
|
||||||
#include "vk_enum_to_str.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);
|
parse_debug_string(os_get_option("VN_DEBUG"), vn_debug_options);
|
||||||
vn_env.perf =
|
vn_env.perf =
|
||||||
parse_debug_string(os_get_option("VN_PERF"), vn_perf_options);
|
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
|
void
|
||||||
|
|
|
@ -181,6 +181,8 @@ struct vn_refcount {
|
||||||
struct vn_env {
|
struct vn_env {
|
||||||
uint64_t debug;
|
uint64_t debug;
|
||||||
uint64_t perf;
|
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;
|
extern struct vn_env vn_env;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue