1 /*
2 * Copyright © 2021 Collabora Ltd.
3 * SPDX-License-Identifier: MIT
4 */
5
6 #ifndef PANVK_BUFFER_H
7 #define PANVK_BUFFER_H
8
9 #include <stdint.h>
10
11 #include "vk_buffer.h"
12
13 struct panvk_priv_bo;
14
15 struct panvk_buffer {
16 struct vk_buffer vk;
17
18 uint64_t dev_addr;
19
20 /* TODO: See if we can rework the synchronization logic so we don't need to
21 * pass BOs around.
22 */
23 struct pan_kmod_bo *bo;
24
25 /* FIXME: Only used for index buffers to do the min/max index retrieval on
26 * the CPU. This is all broken anyway and the min/max search should be done
27 * with a compute shader that also patches the job descriptor accordingly
28 * (basically an indirect draw).
29 *
30 * Make sure this field goes away as soon as we fixed indirect draws.
31 */
32 void *host_ptr;
33 };
34
35 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_buffer, vk.base, VkBuffer,
36 VK_OBJECT_TYPE_BUFFER)
37
38 static inline uint64_t
panvk_buffer_gpu_ptr(const struct panvk_buffer * buffer,uint64_t offset)39 panvk_buffer_gpu_ptr(const struct panvk_buffer *buffer, uint64_t offset)
40 {
41 if (!buffer->dev_addr)
42 return 0;
43
44 return buffer->dev_addr + offset;
45 }
46
47 static inline uint64_t
panvk_buffer_range(const struct panvk_buffer * buffer,uint64_t offset,uint64_t range)48 panvk_buffer_range(const struct panvk_buffer *buffer, uint64_t offset,
49 uint64_t range)
50 {
51 if (!buffer->dev_addr)
52 return 0;
53
54 return vk_buffer_range(&buffer->vk, offset, range);
55 }
56
57 #endif
58