vulkan/alloc: Add VK_MULTIALLOC_DECL macros
These both declare the variable and add it to the allocator in one go. Reviewed-by: Jesse Natalie <jenatali@microsoft.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9511>
This commit is contained in:
@@ -372,18 +372,16 @@ VkResult anv_CreateDescriptorSetLayout(
|
||||
immutable_sampler_count += pCreateInfo->pBindings[j].descriptorCount;
|
||||
}
|
||||
|
||||
struct anv_descriptor_set_layout *set_layout;
|
||||
struct anv_descriptor_set_binding_layout *bindings;
|
||||
struct anv_sampler **samplers;
|
||||
|
||||
/* We need to allocate decriptor set layouts off the device allocator
|
||||
* with DEVICE scope because they are reference counted and may not be
|
||||
* destroyed when vkDestroyDescriptorSetLayout is called.
|
||||
*/
|
||||
VK_MULTIALLOC(ma);
|
||||
vk_multialloc_add(&ma, &set_layout, 1);
|
||||
vk_multialloc_add(&ma, &bindings, max_binding + 1);
|
||||
vk_multialloc_add(&ma, &samplers, immutable_sampler_count);
|
||||
VK_MULTIALLOC_DECL(&ma, struct anv_descriptor_set_layout, set_layout, 1);
|
||||
VK_MULTIALLOC_DECL(&ma, struct anv_descriptor_set_binding_layout,
|
||||
bindings, max_binding + 1);
|
||||
VK_MULTIALLOC_DECL(&ma, struct anv_sampler *, samplers,
|
||||
immutable_sampler_count);
|
||||
|
||||
if (!vk_multialloc_alloc(&ma, &device->vk.alloc,
|
||||
VK_SYSTEM_ALLOCATION_SCOPE_DEVICE))
|
||||
|
@@ -311,24 +311,22 @@ VkResult anv_CreateRenderPass2(
|
||||
|
||||
assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR);
|
||||
|
||||
struct anv_render_pass *pass;
|
||||
struct anv_subpass *subpasses;
|
||||
struct anv_render_pass_attachment *attachments;
|
||||
enum anv_pipe_bits *subpass_flushes;
|
||||
|
||||
VK_MULTIALLOC(ma);
|
||||
vk_multialloc_add(&ma, &pass, 1);
|
||||
vk_multialloc_add(&ma, &subpasses, pCreateInfo->subpassCount);
|
||||
vk_multialloc_add(&ma, &attachments, pCreateInfo->attachmentCount);
|
||||
vk_multialloc_add(&ma, &subpass_flushes, pCreateInfo->subpassCount + 1);
|
||||
VK_MULTIALLOC_DECL(&ma, struct anv_render_pass, pass, 1);
|
||||
VK_MULTIALLOC_DECL(&ma, struct anv_subpass, subpasses,
|
||||
pCreateInfo->subpassCount);
|
||||
VK_MULTIALLOC_DECL(&ma, struct anv_render_pass_attachment, attachments,
|
||||
pCreateInfo->attachmentCount);
|
||||
VK_MULTIALLOC_DECL(&ma, enum anv_pipe_bits, subpass_flushes,
|
||||
pCreateInfo->subpassCount + 1);
|
||||
|
||||
struct anv_subpass_attachment *subpass_attachments;
|
||||
uint32_t subpass_attachment_count = 0;
|
||||
for (uint32_t i = 0; i < pCreateInfo->subpassCount; i++) {
|
||||
subpass_attachment_count +=
|
||||
num_subpass_attachments2(&pCreateInfo->pSubpasses[i]);
|
||||
}
|
||||
vk_multialloc_add(&ma, &subpass_attachments, subpass_attachment_count);
|
||||
VK_MULTIALLOC_DECL(&ma, struct anv_subpass_attachment, subpass_attachments,
|
||||
subpass_attachment_count);
|
||||
|
||||
if (!vk_multialloc_alloc2(&ma, &device->vk.alloc, pAllocator,
|
||||
VK_SYSTEM_ALLOCATION_SCOPE_OBJECT))
|
||||
|
@@ -42,28 +42,24 @@ anv_shader_bin_create(struct anv_device *device,
|
||||
const nir_xfb_info *xfb_info_in,
|
||||
const struct anv_pipeline_bind_map *bind_map)
|
||||
{
|
||||
struct anv_shader_bin *shader;
|
||||
struct anv_shader_bin_key *key;
|
||||
struct brw_stage_prog_data *prog_data;
|
||||
struct brw_shader_reloc *prog_data_relocs;
|
||||
uint32_t *prog_data_param;
|
||||
nir_xfb_info *xfb_info;
|
||||
struct anv_pipeline_binding *surface_to_descriptor, *sampler_to_descriptor;
|
||||
|
||||
VK_MULTIALLOC(ma);
|
||||
vk_multialloc_add(&ma, &shader, 1);
|
||||
vk_multialloc_add_size(&ma, &key, sizeof(*key) + key_size);
|
||||
vk_multialloc_add_size(&ma, &prog_data, prog_data_size);
|
||||
vk_multialloc_add(&ma, &prog_data_relocs, prog_data_in->num_relocs);
|
||||
vk_multialloc_add(&ma, &prog_data_param, prog_data_in->nr_params);
|
||||
if (xfb_info_in) {
|
||||
uint32_t xfb_info_size = nir_xfb_info_size(xfb_info_in->output_count);
|
||||
vk_multialloc_add_size(&ma, &xfb_info, xfb_info_size);
|
||||
}
|
||||
vk_multialloc_add(&ma, &surface_to_descriptor,
|
||||
bind_map->surface_count);
|
||||
vk_multialloc_add(&ma, &sampler_to_descriptor,
|
||||
bind_map->sampler_count);
|
||||
VK_MULTIALLOC_DECL(&ma, struct anv_shader_bin, shader, 1);
|
||||
VK_MULTIALLOC_DECL_SIZE(&ma, struct anv_shader_bin_key, key,
|
||||
sizeof(*key) + key_size);
|
||||
VK_MULTIALLOC_DECL_SIZE(&ma, struct brw_stage_prog_data, prog_data,
|
||||
prog_data_size);
|
||||
VK_MULTIALLOC_DECL(&ma, struct brw_shader_reloc, prog_data_relocs,
|
||||
prog_data_in->num_relocs);
|
||||
VK_MULTIALLOC_DECL(&ma, uint32_t, prog_data_param, prog_data_in->nr_params);
|
||||
|
||||
VK_MULTIALLOC_DECL_SIZE(&ma, nir_xfb_info, xfb_info,
|
||||
xfb_info_in == NULL ? 0 :
|
||||
nir_xfb_info_size(xfb_info_in->output_count));
|
||||
|
||||
VK_MULTIALLOC_DECL(&ma, struct anv_pipeline_binding, surface_to_descriptor,
|
||||
bind_map->surface_count);
|
||||
VK_MULTIALLOC_DECL(&ma, struct anv_pipeline_binding, sampler_to_descriptor,
|
||||
bind_map->sampler_count);
|
||||
|
||||
if (!vk_multialloc_alloc(&ma, &device->vk.alloc,
|
||||
VK_SYSTEM_ALLOCATION_SCOPE_DEVICE))
|
||||
|
@@ -2787,11 +2787,10 @@ VkResult anv_WaitSemaphores(
|
||||
ANV_FROM_HANDLE(anv_device, device, _device);
|
||||
uint32_t *handles;
|
||||
struct anv_timeline **timelines;
|
||||
uint64_t *values;
|
||||
|
||||
VK_MULTIALLOC(ma);
|
||||
|
||||
vk_multialloc_add(&ma, &values, pWaitInfo->semaphoreCount);
|
||||
VK_MULTIALLOC_DECL(&ma, uint64_t, values, pWaitInfo->semaphoreCount);
|
||||
if (device->has_thread_submit) {
|
||||
vk_multialloc_add(&ma, &handles, pWaitInfo->semaphoreCount);
|
||||
} else {
|
||||
|
@@ -306,12 +306,10 @@ VkResult anv_QueuePresentKHR(
|
||||
* using a threaded submission.
|
||||
*/
|
||||
VK_MULTIALLOC(ma);
|
||||
|
||||
uint64_t *values;
|
||||
uint32_t *syncobjs;
|
||||
|
||||
vk_multialloc_add(&ma, &values, pPresentInfo->waitSemaphoreCount);
|
||||
vk_multialloc_add(&ma, &syncobjs, pPresentInfo->waitSemaphoreCount);
|
||||
VK_MULTIALLOC_DECL(&ma, uint64_t, values,
|
||||
pPresentInfo->waitSemaphoreCount);
|
||||
VK_MULTIALLOC_DECL(&ma, uint32_t, syncobjs,
|
||||
pPresentInfo->waitSemaphoreCount);
|
||||
|
||||
if (!vk_multialloc_alloc(&ma, &device->vk.alloc,
|
||||
VK_SYSTEM_ALLOCATION_SCOPE_COMMAND))
|
||||
|
@@ -72,7 +72,6 @@ VkResult genX(CreateQueryPool)(
|
||||
uint32_t n_passes = 0;
|
||||
#endif
|
||||
uint32_t data_offset = 0;
|
||||
struct anv_query_pool *pool;
|
||||
VK_MULTIALLOC(ma);
|
||||
VkResult result;
|
||||
|
||||
@@ -90,7 +89,7 @@ VkResult genX(CreateQueryPool)(
|
||||
*/
|
||||
uint32_t uint64s_per_slot = 0;
|
||||
|
||||
vk_multialloc_add(&ma, &pool, 1);
|
||||
VK_MULTIALLOC_DECL(&ma, struct anv_query_pool, pool, 1);
|
||||
|
||||
VkQueryPipelineStatisticFlags pipeline_statistics = 0;
|
||||
switch (pCreateInfo->queryType) {
|
||||
|
@@ -182,6 +182,13 @@ _vk_multialloc_add(struct vk_multialloc *ma,
|
||||
#define vk_multialloc_add(_ma, _ptr, _count) \
|
||||
vk_multialloc_add_size(_ma, _ptr, (_count) * sizeof(**(_ptr)));
|
||||
|
||||
#define VK_MULTIALLOC_DECL_SIZE(_ma, _type, _name, _size) \
|
||||
_type *_name; \
|
||||
vk_multialloc_add_size(_ma, &_name, _size);
|
||||
|
||||
#define VK_MULTIALLOC_DECL(_ma, _type, _name, _count) \
|
||||
VK_MULTIALLOC_DECL_SIZE(_ma, _type, _name, (_count) * sizeof(_type));
|
||||
|
||||
static ALWAYS_INLINE void *
|
||||
vk_multialloc_alloc(struct vk_multialloc *ma,
|
||||
const VkAllocationCallbacks *alloc,
|
||||
|
@@ -64,12 +64,6 @@ vk_common_CreateRenderPass(VkDevice _device,
|
||||
{
|
||||
VK_FROM_HANDLE(vk_device, device, _device);
|
||||
|
||||
VkRenderPassCreateInfo2 *create_info;
|
||||
VkAttachmentDescription2 *attachments;
|
||||
VkSubpassDescription2 *subpasses;
|
||||
VkSubpassDependency2 *dependencies;
|
||||
VkAttachmentReference2 *references;
|
||||
|
||||
uint32_t reference_count = 0;
|
||||
for (uint32_t i = 0; i < pCreateInfo->subpassCount; i++) {
|
||||
reference_count += pCreateInfo->pSubpasses[i].inputAttachmentCount;
|
||||
@@ -81,11 +75,15 @@ vk_common_CreateRenderPass(VkDevice _device,
|
||||
}
|
||||
|
||||
VK_MULTIALLOC(ma);
|
||||
vk_multialloc_add(&ma, &create_info, 1);
|
||||
vk_multialloc_add(&ma, &subpasses, pCreateInfo->subpassCount);
|
||||
vk_multialloc_add(&ma, &attachments, pCreateInfo->attachmentCount);
|
||||
vk_multialloc_add(&ma, &dependencies, pCreateInfo->dependencyCount);
|
||||
vk_multialloc_add(&ma, &references, reference_count);
|
||||
VK_MULTIALLOC_DECL(&ma, VkRenderPassCreateInfo2, create_info, 1);
|
||||
VK_MULTIALLOC_DECL(&ma, VkSubpassDescription2, subpasses,
|
||||
pCreateInfo->subpassCount);
|
||||
VK_MULTIALLOC_DECL(&ma, VkAttachmentDescription2, attachments,
|
||||
pCreateInfo->attachmentCount);
|
||||
VK_MULTIALLOC_DECL(&ma, VkSubpassDependency2, dependencies,
|
||||
pCreateInfo->dependencyCount);
|
||||
VK_MULTIALLOC_DECL(&ma, VkAttachmentReference2, references,
|
||||
reference_count);
|
||||
if (!vk_multialloc_alloc2(&ma, &device->alloc, pAllocator,
|
||||
VK_SYSTEM_ALLOCATION_SCOPE_COMMAND))
|
||||
return VK_ERROR_OUT_OF_HOST_MEMORY;
|
||||
|
Reference in New Issue
Block a user