[PATCH vkd3d 1/4] vkd3d: Avoid heap memory allocations while updating descriptor tables.
Józef Kucia
joseph.kucia at gmail.com
Fri Oct 19 09:55:47 CDT 2018
From: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
libs/vkd3d/command.c | 27 ++++++++++++---------------
1 file changed, 12 insertions(+), 15 deletions(-)
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index e17fca979a9d..d8a65622507d 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -2084,13 +2084,13 @@ static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list
VkPipelineBindPoint bind_point, unsigned int index, D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor)
{
struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point];
+ struct VkWriteDescriptorSet descriptor_writes[24], *current_descriptor_write;
const struct d3d12_root_signature *root_signature = bindings->root_signature;
- struct VkWriteDescriptorSet *descriptor_writes, *current_descriptor_write;
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
- struct VkDescriptorImageInfo *image_infos, *current_image_info;
+ struct VkDescriptorImageInfo image_infos[24], *current_image_info;
const struct d3d12_root_descriptor_table *descriptor_table;
const struct d3d12_root_descriptor_table_range *range;
- struct d3d12_device *device = list->device;
+ VkDevice vk_device = list->device->vk_device;
unsigned int i, j, descriptor_count;
struct d3d12_desc *descriptor;
@@ -2110,14 +2110,6 @@ static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list
return;
}
- if (!(descriptor_writes = vkd3d_calloc(descriptor_count, sizeof(*descriptor_writes))))
- return;
- if (!(image_infos = vkd3d_calloc(descriptor_count, sizeof(*image_infos))))
- {
- vkd3d_free(descriptor_writes);
- return;
- }
-
descriptor_count = 0;
current_descriptor_write = descriptor_writes;
current_image_info = image_infos;
@@ -2153,13 +2145,18 @@ static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list
++descriptor_count;
++current_descriptor_write;
++current_image_info;
+
+ if (descriptor_count == ARRAY_SIZE(descriptor_writes))
+ {
+ VK_CALL(vkUpdateDescriptorSets(vk_device, descriptor_count, descriptor_writes, 0, NULL));
+ descriptor_count = 0;
+ current_descriptor_write = descriptor_writes;
+ current_image_info = image_infos;
+ }
}
}
- VK_CALL(vkUpdateDescriptorSets(device->vk_device, descriptor_count, descriptor_writes, 0, NULL));
-
- vkd3d_free(descriptor_writes);
- vkd3d_free(image_infos);
+ VK_CALL(vkUpdateDescriptorSets(vk_device, descriptor_count, descriptor_writes, 0, NULL));
}
static bool vk_write_descriptor_set_from_root_descriptor(VkWriteDescriptorSet *vk_descriptor_write,
--
2.18.1
More information about the wine-devel
mailing list