| /* |
| * Copyright © 2024 Collabora Ltd. |
| * SPDX-License-Identifier: MIT |
| */ |
| |
| #ifndef PANVK_CMD_ALLOC_H |
| #define PANVK_CMD_ALLOC_H |
| |
| #include "panvk_cmd_buffer.h" |
| #include "panvk_macros.h" |
| #include "panvk_mempool.h" |
| |
| static inline struct panfrost_ptr |
| panvk_cmd_alloc_from_pool(struct panvk_cmd_buffer *cmdbuf, |
| struct panvk_pool *pool, |
| struct panvk_pool_alloc_info info) |
| { |
| if (!info.size) |
| return (struct panfrost_ptr){0}; |
| |
| struct panfrost_ptr ptr = |
| pan_pool_alloc_aligned(&pool->base, info.size, info.alignment); |
| |
| if (!ptr.gpu) { |
| VkResult error = |
| panvk_catch_indirect_alloc_failure(VK_ERROR_OUT_OF_DEVICE_MEMORY); |
| vk_command_buffer_set_error(&cmdbuf->vk, error); |
| } |
| |
| return ptr; |
| } |
| |
| #define panvk_cmd_alloc_dev_mem(__cmdbuf, __poolnm, __sz, __alignment) \ |
| panvk_cmd_alloc_from_pool(__cmdbuf, &(__cmdbuf)->__poolnm##_pool, \ |
| (struct panvk_pool_alloc_info){ \ |
| .size = __sz, \ |
| .alignment = __alignment, \ |
| }) |
| |
| #define panvk_cmd_alloc_desc_aggregate(__cmdbuf, ...) \ |
| panvk_cmd_alloc_from_pool( \ |
| __cmdbuf, &(__cmdbuf)->desc_pool, \ |
| panvk_pool_descs_to_alloc_info(PAN_DESC_AGGREGATE(__VA_ARGS__))) |
| |
| #define panvk_cmd_alloc_desc(__cmdbuf, __desc) \ |
| panvk_cmd_alloc_desc_aggregate(__cmdbuf, PAN_DESC(__desc)) |
| |
| #define panvk_cmd_alloc_desc_array(__cmdbuf, __count, __desc) \ |
| panvk_cmd_alloc_desc_aggregate(__cmdbuf, PAN_DESC_ARRAY(__count, __desc)) |
| |
| #endif |