1 /*
2 * Copyright © 2024 Collabora Ltd.
3 * SPDX-License-Identifier: MIT
4 */
5
6 #ifndef PANVK_CMD_ALLOC_H
7 #define PANVK_CMD_ALLOC_H
8
9 #include "panvk_cmd_buffer.h"
10 #include "panvk_macros.h"
11 #include "panvk_mempool.h"
12
13 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)14 panvk_cmd_alloc_from_pool(struct panvk_cmd_buffer *cmdbuf,
15 struct panvk_pool *pool,
16 struct panvk_pool_alloc_info info)
17 {
18 if (!info.size)
19 return (struct panfrost_ptr){0};
20
21 struct panfrost_ptr ptr =
22 pan_pool_alloc_aligned(&pool->base, info.size, info.alignment);
23
24 if (!ptr.gpu) {
25 VkResult error =
26 panvk_catch_indirect_alloc_failure(VK_ERROR_OUT_OF_DEVICE_MEMORY);
27 vk_command_buffer_set_error(&cmdbuf->vk, error);
28 }
29
30 return ptr;
31 }
32
33 #define panvk_cmd_alloc_dev_mem(__cmdbuf, __poolnm, __sz, __alignment) \
34 panvk_cmd_alloc_from_pool(__cmdbuf, &(__cmdbuf)->__poolnm##_pool, \
35 (struct panvk_pool_alloc_info){ \
36 .size = __sz, \
37 .alignment = __alignment, \
38 })
39
40 #define panvk_cmd_alloc_desc_aggregate(__cmdbuf, ...) \
41 panvk_cmd_alloc_from_pool( \
42 __cmdbuf, &(__cmdbuf)->desc_pool, \
43 panvk_pool_descs_to_alloc_info(PAN_DESC_AGGREGATE(__VA_ARGS__)))
44
45 #define panvk_cmd_alloc_desc(__cmdbuf, __desc) \
46 panvk_cmd_alloc_desc_aggregate(__cmdbuf, PAN_DESC(__desc))
47
48 #define panvk_cmd_alloc_desc_array(__cmdbuf, __count, __desc) \
49 panvk_cmd_alloc_desc_aggregate(__cmdbuf, PAN_DESC_ARRAY(__count, __desc))
50
51 #endif
52