xref: /aosp_15_r20/external/mesa3d/src/panfrost/vulkan/panvk_buffer.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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