xref: /aosp_15_r20/external/mesa3d/src/asahi/vulkan/hk_descriptor_set.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright 2024 Valve Corporation
3  * Copyright 2024 Alyssa Rosenzweig
4  * Copyright 2022-2023 Collabora Ltd. and Red Hat Inc.
5  * SPDX-License-Identifier: MIT
6  */
7 
8 #pragma once
9 
10 #include "hk_private.h"
11 
12 #include "hk_device.h"
13 #include "vk_descriptor_update_template.h"
14 #include "vk_object.h"
15 
16 #include "util/list.h"
17 #include "util/vma.h"
18 
19 /* Stride of the image heap, equal to the size of a texture/PBE descriptor */
20 #define HK_IMAGE_STRIDE (24)
21 
22 struct hk_descriptor_set_layout;
23 
24 struct hk_sampled_image_descriptor {
25    uint32_t image_offset;
26    uint16_t sampler_index;
27    uint16_t lod_bias_fp16;
28    /* TODO: This should probably be a heap! */
29    uint32_t border[4];
30    /* XXX: Single bit! Tuck it in somewhere else */
31    uint32_t has_border;
32    uint16_t clamp_0_sampler_index;
33    uint16_t pad_0;
34 };
35 static_assert(sizeof(struct hk_sampled_image_descriptor) == 32,
36               "hk_sampled_image_descriptor has no holes");
37 
38 struct hk_storage_image_descriptor {
39    uint32_t tex_offset;
40    uint32_t pbe_offset;
41 };
42 static_assert(sizeof(struct hk_storage_image_descriptor) == 8,
43               "hk_storage_image_descriptor has no holes");
44 
45 struct hk_buffer_view_descriptor {
46    uint32_t tex_offset;
47    uint32_t pbe_offset;
48 };
49 static_assert(sizeof(struct hk_buffer_view_descriptor) == 8,
50               "hk_buffer_view_descriptor has no holes");
51 
52 /* This has to match nir_address_format_64bit_bounded_global */
53 struct hk_buffer_address {
54    uint64_t base_addr;
55    uint32_t size;
56    uint32_t zero; /* Must be zero! */
57 };
58 
59 struct hk_descriptor_pool {
60    struct vk_object_base base;
61 
62    struct list_head sets;
63 
64    struct agx_bo *bo;
65    uint8_t *mapped_ptr;
66    struct util_vma_heap heap;
67 };
68 
69 VK_DEFINE_NONDISP_HANDLE_CASTS(hk_descriptor_pool, base, VkDescriptorPool,
70                                VK_OBJECT_TYPE_DESCRIPTOR_POOL)
71 
72 struct hk_descriptor_set {
73    struct vk_object_base base;
74 
75    /* Link in hk_descriptor_pool::sets */
76    struct list_head link;
77 
78    struct hk_descriptor_set_layout *layout;
79    void *mapped_ptr;
80    uint64_t addr;
81    uint32_t size;
82 
83    struct hk_buffer_address dynamic_buffers[];
84 };
85 
VK_DEFINE_NONDISP_HANDLE_CASTS(hk_descriptor_set,base,VkDescriptorSet,VK_OBJECT_TYPE_DESCRIPTOR_SET)86 VK_DEFINE_NONDISP_HANDLE_CASTS(hk_descriptor_set, base, VkDescriptorSet,
87                                VK_OBJECT_TYPE_DESCRIPTOR_SET)
88 
89 static inline uint64_t
90 hk_descriptor_set_addr(const struct hk_descriptor_set *set)
91 {
92    return set->addr;
93 }
94 
95 struct hk_push_descriptor_set {
96    uint8_t data[HK_PUSH_DESCRIPTOR_SET_SIZE];
97 };
98 
99 void hk_push_descriptor_set_update(struct hk_push_descriptor_set *push_set,
100                                    struct hk_descriptor_set_layout *layout,
101                                    uint32_t write_count,
102                                    const VkWriteDescriptorSet *writes);
103 
104 void hk_push_descriptor_set_update_template(
105    struct hk_push_descriptor_set *push_set,
106    struct hk_descriptor_set_layout *layout,
107    const struct vk_descriptor_update_template *template, const void *data);
108