1 /*
2 * Copyright © 2022 Collabora Ltd. and Red Hat Inc.
3 * SPDX-License-Identifier: MIT
4 */
5 #ifndef NVK_DESCRIPTOR_SET
6 #define NVK_DESCRIPTOR_SET 1
7
8 #include "nvk_private.h"
9
10 #include "nouveau_bo.h"
11 #include "nvk_device.h"
12 #include "vulkan/runtime/vk_object.h"
13 #include "vulkan/runtime/vk_descriptor_update_template.h"
14
15 struct nvk_descriptor_set_layout;
16
17 #define NVK_IMAGE_DESCRIPTOR_IMAGE_INDEX_MASK 0x000fffff
18 #define NVK_IMAGE_DESCRIPTOR_SAMPLER_INDEX_MASK 0xfff00000
19
20 struct nvk_image_descriptor {
21 unsigned image_index:20;
22 unsigned sampler_index:12;
23 };
24
25 /* This has to match nir_address_format_64bit_bounded_global */
26 struct nvk_buffer_address {
27 uint64_t base_addr;
28 uint32_t size;
29 uint32_t zero; /* Must be zero! */
30 };
31
32 struct nvk_descriptor_pool_entry {
33 uint32_t offset;
34 uint32_t size;
35 struct nvk_descriptor_set *set;
36 };
37
38 struct nvk_descriptor_pool {
39 struct vk_object_base base;
40 struct nouveau_ws_bo *bo;
41 uint8_t *mapped_ptr;
42 uint64_t current_offset;
43 uint64_t size;
44 uint32_t entry_count;
45 uint32_t max_entry_count;
46 struct nvk_descriptor_pool_entry entries[0];
47 };
48
49 VK_DEFINE_NONDISP_HANDLE_CASTS(nvk_descriptor_pool, base, VkDescriptorPool,
50 VK_OBJECT_TYPE_DESCRIPTOR_POOL)
51
52 struct nvk_descriptor_set {
53 struct vk_object_base base;
54 struct nvk_descriptor_set_layout *layout;
55 void *mapped_ptr;
56 uint64_t addr;
57 uint32_t size;
58
59 struct nvk_buffer_address dynamic_buffers[];
60 };
61
VK_DEFINE_NONDISP_HANDLE_CASTS(nvk_descriptor_set,base,VkDescriptorSet,VK_OBJECT_TYPE_DESCRIPTOR_SET)62 VK_DEFINE_NONDISP_HANDLE_CASTS(nvk_descriptor_set, base, VkDescriptorSet,
63 VK_OBJECT_TYPE_DESCRIPTOR_SET)
64
65 static inline uint64_t
66 nvk_descriptor_set_addr(const struct nvk_descriptor_set *set)
67 {
68 return set->addr;
69 }
70
71 struct nvk_push_descriptor_set {
72 uint8_t data[NVK_PUSH_DESCRIPTOR_SET_SIZE];
73 };
74
75 void
76 nvk_push_descriptor_set_update(struct nvk_push_descriptor_set *push_set,
77 struct nvk_descriptor_set_layout *layout,
78 uint32_t write_count,
79 const VkWriteDescriptorSet *writes);
80
81 void
82 nvk_push_descriptor_set_update_template(
83 struct nvk_push_descriptor_set *push_set,
84 struct nvk_descriptor_set_layout *layout,
85 const struct vk_descriptor_update_template *template,
86 const void *data);
87
88 #endif
89