[PATCH] wined3d: Prevent buildup of retired buffer objects' memory.

Jan Sikorski jsikorski at codeweavers.com
Tue Apr 20 04:36:53 CDT 2021


Submit current command buffer in wined3d_context_vk_get_command_buffer()
and return a new one if the total size of retired buffer objects on that
command buffer crosses a predefined threshold.

Signed-off-by: Jan Sikorski <jsikorski at codeweavers.com>
---
 dlls/wined3d/context_vk.c      | 15 ++++++++++++---
 dlls/wined3d/wined3d_private.h |  2 ++
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c
index 45133eabb69..89706d455f5 100644
--- a/dlls/wined3d/context_vk.c
+++ b/dlls/wined3d/context_vk.c
@@ -921,6 +921,9 @@ void wined3d_context_vk_destroy_bo(struct wined3d_context_vk *context_vk, const
     if (bo->map_ptr)
         VK_CALL(vkUnmapMemory(device_vk->vk_device, bo->vk_memory));
     wined3d_context_vk_destroy_vk_memory(context_vk, bo->vk_memory, bo->command_buffer_id);
+
+    if (bo->command_buffer_id == context_vk->current_command_buffer.id)
+        context_vk->retired_bo_counter += bo->size;
 }
 
 void wined3d_context_vk_poll_command_buffers(struct wined3d_context_vk *context_vk)
@@ -1509,9 +1512,14 @@ VkCommandBuffer wined3d_context_vk_get_command_buffer(struct wined3d_context_vk
     buffer = &context_vk->current_command_buffer;
     if (buffer->vk_command_buffer)
     {
-        TRACE("Returning existing command buffer %p with id 0x%s.\n",
-                buffer->vk_command_buffer, wine_dbgstr_longlong(buffer->id));
-        return buffer->vk_command_buffer;
+        if (context_vk->retired_bo_counter > WINED3D_RETIRED_BO_COUNTER_THRESHOLD)
+            wined3d_context_vk_submit_command_buffer(context_vk, 0, NULL, NULL, 0, NULL);
+        else
+        {
+            TRACE("Returning existing command buffer %p with id 0x%s.\n",
+                    buffer->vk_command_buffer, wine_dbgstr_longlong(buffer->id));
+            return buffer->vk_command_buffer;
+        }
     }
 
     command_buffer_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
@@ -1628,6 +1636,7 @@ void wined3d_context_vk_submit_command_buffer(struct wined3d_context_vk *context
         context_vk->completed_command_buffer_id = 0;
         buffer->id = 1;
     }
+    context_vk->retired_bo_counter = 0;
     wined3d_context_vk_cleanup_resources(context_vk);
 }
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index c3e3752ed71..694436ddad2 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2549,6 +2549,8 @@ struct wined3d_context_vk
     VkCommandPool vk_command_pool;
     struct wined3d_command_buffer_vk current_command_buffer;
     uint64_t completed_command_buffer_id;
+#define WINED3D_RETIRED_BO_COUNTER_THRESHOLD (64 << 20)
+    size_t retired_bo_counter;
 
     struct
     {
-- 
2.31.0




More information about the wine-devel mailing list