venus: flush when batched draw calls reach a threshold
authorYiwei Zhang <zzyiwei@chromium.org>
Tue, 26 Apr 2022 19:25:54 +0000 (19:25 +0000)
committerMarge Bot <emma+marge@anholt.net>
Tue, 26 Apr 2022 23:49:59 +0000 (23:49 +0000)
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>

src/virtio/vulkan/vn_command_buffer.c
src/virtio/vulkan/vn_command_buffer.h
src/virtio/vulkan/vn_common.c
src/virtio/vulkan/vn_common.h

index 8ee673b..b293288 100644 (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
index f157d73..07312e2 100644 (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,
index e39c5fa..435e7ce 100644 (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
index 19831c6..a7db1fc 100644 (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;