vulkan: Fix storage buffer handling

Instead of keeping a 256MB storage buffer around just to be safe, create
a 32kB one and handle enlarging the bfufer by 32kB when necessary.

The 32kB is quite arbitrarily chosen.
This commit is contained in:
Benjamin Otte
2023-07-23 04:51:24 +02:00
parent 5d30b347a9
commit 9a6b1ff82b

View File

@@ -26,6 +26,7 @@
#define DESCRIPTOR_POOL_MAXITEMS 50000
#define VERTEX_BUFFER_SIZE_STEP 128 * 1024 /* 128kB */
#define STORAGE_BUFFER_SIZE_STEP 32 * 1024
#define GDK_ARRAY_NAME gsk_descriptor_image_infos
#define GDK_ARRAY_TYPE_NAME GskDescriptorImageInfos
@@ -726,11 +727,7 @@ gsk_vulkan_render_ensure_storage_buffer (GskVulkanRender *self)
return;
if (self->storage_buffer == NULL)
{
self->storage_buffer = gsk_vulkan_buffer_new_storage (self->vulkan,
/* random */
sizeof (float) * 64 * 1024 * 1024);
}
self->storage_buffer = gsk_vulkan_buffer_new_storage (self->vulkan, STORAGE_BUFFER_SIZE_STEP);
self->storage_buffer_memory = gsk_vulkan_buffer_get_data (self->storage_buffer);
@@ -780,11 +777,21 @@ gsk_vulkan_render_get_buffer_memory (GskVulkanRender *self,
gsk_vulkan_render_ensure_storage_buffer (self);
self->storage_buffer_used = round_up (self->storage_buffer_used, alignment);
if (self->storage_buffer_used + size > gsk_vulkan_buffer_get_size (self->storage_buffer))
{
gsize larger_size = 1 << g_bit_storage (self->storage_buffer_used + size - 1);
GskVulkanBuffer *larger_buffer = gsk_vulkan_buffer_new_storage (self->vulkan, larger_size);
guchar *larger_memory = gsk_vulkan_buffer_get_data (larger_buffer);
memcpy (larger_memory, self->storage_buffer_memory, self->storage_buffer_used);
gsk_vulkan_buffer_free (self->storage_buffer);
self->storage_buffer = larger_buffer;
self->storage_buffer_memory = larger_memory;
gsk_descriptor_buffer_infos_index (&self->descriptor_buffers, 0)->buffer = gsk_vulkan_buffer_get_buffer (larger_buffer);
}
result = self->storage_buffer_memory + self->storage_buffer_used;
*out_offset = self->storage_buffer_used / sizeof (float);
self->storage_buffer_used += size;
g_assert (self->storage_buffer_used <= gsk_vulkan_buffer_get_size (self->storage_buffer));
return result;
}