From 1598d18a8868b6f506811661a20fa65307349771 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Tue, 26 Apr 2022 19:25:54 +0000 Subject: [PATCH] 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 Part-of: --- src/virtio/vulkan/vn_command_buffer.c | 31 +++++++++++++++++++++++++++++++ src/virtio/vulkan/vn_command_buffer.h | 2 ++ src/virtio/vulkan/vn_common.c | 5 +++++ src/virtio/vulkan/vn_common.h | 2 ++ 4 files changed, 40 insertions(+) diff --git a/src/virtio/vulkan/vn_command_buffer.c b/src/virtio/vulkan/vn_command_buffer.c index 8ee673b..b293288 100644 --- a/src/virtio/vulkan/vn_command_buffer.c +++ b/src/virtio/vulkan/vn_command_buffer.c @@ -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 diff --git a/src/virtio/vulkan/vn_command_buffer.h b/src/virtio/vulkan/vn_command_buffer.h index f157d73..07312e2 100644 --- a/src/virtio/vulkan/vn_command_buffer.h +++ b/src/virtio/vulkan/vn_command_buffer.h @@ -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, diff --git a/src/virtio/vulkan/vn_common.c b/src/virtio/vulkan/vn_common.c index e39c5fa..435e7ce 100644 --- a/src/virtio/vulkan/vn_common.c +++ b/src/virtio/vulkan/vn_common.c @@ -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 diff --git a/src/virtio/vulkan/vn_common.h b/src/virtio/vulkan/vn_common.h index 19831c6..a7db1fc 100644 --- a/src/virtio/vulkan/vn_common.h +++ b/src/virtio/vulkan/vn_common.h @@ -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; -- 2.7.4