xref: /aosp_15_r20/external/mesa3d/src/nouveau/vulkan/nvk_heap.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2022 Collabora Ltd. and Red Hat Inc.
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker #ifndef NVK_HEAP_H
6*61046927SAndroid Build Coastguard Worker #define NVK_HEAP_H 1
7*61046927SAndroid Build Coastguard Worker 
8*61046927SAndroid Build Coastguard Worker #include "nvk_private.h"
9*61046927SAndroid Build Coastguard Worker 
10*61046927SAndroid Build Coastguard Worker #include "util/simple_mtx.h"
11*61046927SAndroid Build Coastguard Worker #include "util/vma.h"
12*61046927SAndroid Build Coastguard Worker #include "nvkmd/nvkmd.h"
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker struct nvk_device;
15*61046927SAndroid Build Coastguard Worker 
16*61046927SAndroid Build Coastguard Worker #define NVK_HEAP_MIN_SIZE_LOG2 16
17*61046927SAndroid Build Coastguard Worker #define NVK_HEAP_MAX_SIZE_LOG2 32
18*61046927SAndroid Build Coastguard Worker #define NVK_HEAP_MIN_SIZE (1ull << NVK_HEAP_MIN_SIZE_LOG2)
19*61046927SAndroid Build Coastguard Worker #define NVK_HEAP_MAX_SIZE (1ull << NVK_HEAP_MAX_SIZE_LOG2)
20*61046927SAndroid Build Coastguard Worker #define NVK_HEAP_MAX_BO_COUNT (NVK_HEAP_MAX_SIZE_LOG2 - \
21*61046927SAndroid Build Coastguard Worker                                NVK_HEAP_MIN_SIZE_LOG2 + 1)
22*61046927SAndroid Build Coastguard Worker 
23*61046927SAndroid Build Coastguard Worker struct nvk_heap_mem {
24*61046927SAndroid Build Coastguard Worker    struct nvkmd_mem *mem;
25*61046927SAndroid Build Coastguard Worker    uint64_t addr;
26*61046927SAndroid Build Coastguard Worker };
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker struct nvk_heap {
29*61046927SAndroid Build Coastguard Worker    enum nvkmd_mem_flags mem_flags;
30*61046927SAndroid Build Coastguard Worker    enum nvkmd_mem_map_flags map_flags;
31*61046927SAndroid Build Coastguard Worker    uint32_t overalloc;
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker    simple_mtx_t mutex;
34*61046927SAndroid Build Coastguard Worker    struct util_vma_heap heap;
35*61046927SAndroid Build Coastguard Worker 
36*61046927SAndroid Build Coastguard Worker    /* VA for contiguous heaps, NULL otherwise */
37*61046927SAndroid Build Coastguard Worker    struct nvkmd_va *contig_va;
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker    uint64_t total_size;
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker    uint32_t mem_count;
42*61046927SAndroid Build Coastguard Worker    struct nvk_heap_mem mem[NVK_HEAP_MAX_BO_COUNT];
43*61046927SAndroid Build Coastguard Worker };
44*61046927SAndroid Build Coastguard Worker 
45*61046927SAndroid Build Coastguard Worker VkResult nvk_heap_init(struct nvk_device *dev, struct nvk_heap *heap,
46*61046927SAndroid Build Coastguard Worker                        enum nvkmd_mem_flags mem_flags,
47*61046927SAndroid Build Coastguard Worker                        enum nvkmd_mem_map_flags map_flags,
48*61046927SAndroid Build Coastguard Worker                        uint32_t overalloc, bool contiguous);
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker void nvk_heap_finish(struct nvk_device *dev, struct nvk_heap *heap);
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker VkResult nvk_heap_alloc(struct nvk_device *dev, struct nvk_heap *heap,
53*61046927SAndroid Build Coastguard Worker                         uint64_t size, uint32_t alignment,
54*61046927SAndroid Build Coastguard Worker                         uint64_t *addr_out, void **map_out);
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker VkResult nvk_heap_upload(struct nvk_device *dev, struct nvk_heap *heap,
57*61046927SAndroid Build Coastguard Worker                          const void *data, size_t size, uint32_t alignment,
58*61046927SAndroid Build Coastguard Worker                          uint64_t *addr_out);
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker void nvk_heap_free(struct nvk_device *dev, struct nvk_heap *heap,
61*61046927SAndroid Build Coastguard Worker                    uint64_t addr, uint64_t size);
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker static inline uint64_t
nvk_heap_contiguous_base_address(struct nvk_heap * heap)64*61046927SAndroid Build Coastguard Worker nvk_heap_contiguous_base_address(struct nvk_heap *heap)
65*61046927SAndroid Build Coastguard Worker {
66*61046927SAndroid Build Coastguard Worker    assert(heap->contig_va != NULL);
67*61046927SAndroid Build Coastguard Worker    return heap->contig_va->addr;
68*61046927SAndroid Build Coastguard Worker }
69*61046927SAndroid Build Coastguard Worker 
70*61046927SAndroid Build Coastguard Worker #endif /* define NVK_HEAP_H */
71