• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2019 Google LLC
3  * SPDX-License-Identifier: MIT
4  *
5  * based in part on anv and radv which are:
6  * Copyright © 2015 Intel Corporation
7  * Copyright © 2016 Red Hat.
8  * Copyright © 2016 Bas Nieuwenhuizen
9  */
10 
11 #ifndef VN_DESCRIPTOR_SET_H
12 #define VN_DESCRIPTOR_SET_H
13 
14 #include "vn_common.h"
15 
16 /* TODO accommodate new discrete type enums by:
17  * 1. increase the number of types here
18  * 2. add a helper to map to continuous array index
19  */
20 #define VN_NUM_DESCRIPTOR_TYPES (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT + 1)
21 
22 struct vn_descriptor_set_layout_binding {
23    VkDescriptorType type;
24    uint32_t count;
25    bool has_immutable_samplers;
26 };
27 
28 struct vn_descriptor_set_layout {
29    struct vn_object_base base;
30 
31    struct vn_refcount refcount;
32 
33    uint32_t last_binding;
34    bool has_variable_descriptor_count;
35 
36    /* bindings must be the last field in the layout */
37    struct vn_descriptor_set_layout_binding bindings[];
38 };
39 VK_DEFINE_NONDISP_HANDLE_CASTS(vn_descriptor_set_layout,
40                                base.base,
41                                VkDescriptorSetLayout,
42                                VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT)
43 
44 struct vn_descriptor_pool_state {
45    uint32_t set_count;
46    uint32_t descriptor_counts[VN_NUM_DESCRIPTOR_TYPES];
47 };
48 
49 struct vn_descriptor_pool {
50    struct vn_object_base base;
51 
52    VkAllocationCallbacks allocator;
53    bool async_set_allocation;
54    struct vn_descriptor_pool_state max;
55    struct vn_descriptor_pool_state used;
56 
57    struct list_head descriptor_sets;
58 };
59 VK_DEFINE_NONDISP_HANDLE_CASTS(vn_descriptor_pool,
60                                base.base,
61                                VkDescriptorPool,
62                                VK_OBJECT_TYPE_DESCRIPTOR_POOL)
63 
64 struct vn_update_descriptor_sets {
65    uint32_t write_count;
66    VkWriteDescriptorSet *writes;
67    VkDescriptorImageInfo *images;
68    VkDescriptorBufferInfo *buffers;
69    VkBufferView *views;
70 };
71 
72 struct vn_descriptor_set {
73    struct vn_object_base base;
74 
75    struct vn_descriptor_set_layout *layout;
76    uint32_t last_binding_descriptor_count;
77 
78    struct list_head head;
79 };
80 VK_DEFINE_NONDISP_HANDLE_CASTS(vn_descriptor_set,
81                                base.base,
82                                VkDescriptorSet,
83                                VK_OBJECT_TYPE_DESCRIPTOR_SET)
84 
85 struct vn_descriptor_update_template_entry {
86    size_t offset;
87    size_t stride;
88 };
89 
90 struct vn_descriptor_update_template {
91    struct vn_object_base base;
92 
93    mtx_t mutex;
94    struct vn_update_descriptor_sets *update;
95 
96    struct vn_descriptor_update_template_entry entries[];
97 };
98 VK_DEFINE_NONDISP_HANDLE_CASTS(vn_descriptor_update_template,
99                                base.base,
100                                VkDescriptorUpdateTemplate,
101                                VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE)
102 
103 void
104 vn_descriptor_set_layout_destroy(struct vn_device *dev,
105                                  struct vn_descriptor_set_layout *layout);
106 
107 static inline struct vn_descriptor_set_layout *
vn_descriptor_set_layout_ref(struct vn_device * dev,struct vn_descriptor_set_layout * layout)108 vn_descriptor_set_layout_ref(struct vn_device *dev,
109                              struct vn_descriptor_set_layout *layout)
110 {
111    vn_refcount_inc(&layout->refcount);
112    return layout;
113 }
114 
115 static inline void
vn_descriptor_set_layout_unref(struct vn_device * dev,struct vn_descriptor_set_layout * layout)116 vn_descriptor_set_layout_unref(struct vn_device *dev,
117                                struct vn_descriptor_set_layout *layout)
118 {
119    if (vn_refcount_dec(&layout->refcount))
120       vn_descriptor_set_layout_destroy(dev, layout);
121 }
122 
123 #endif /* VN_DESCRIPTOR_SET_H */
124