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
16enum vn_descriptor_type {
17   VN_DESCRIPTOR_TYPE_SAMPLER,
18   VN_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
19   VN_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
20   VN_DESCRIPTOR_TYPE_STORAGE_IMAGE,
21   VN_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,
22   VN_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
23   VN_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
24   VN_DESCRIPTOR_TYPE_STORAGE_BUFFER,
25   VN_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC,
26   VN_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC,
27   VN_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
28   VN_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK,
29
30   /* add new enum types before this line */
31   VN_NUM_DESCRIPTOR_TYPES,
32};
33
34/* TODO refactor struct to track enum vn_descriptor_type type.
35 * On VkDescriptorSetLayout creation. When we check against
36 * VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK, it will be against
37 * VN_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK instead
38 */
39struct vn_descriptor_set_layout_binding {
40   VkDescriptorType type;
41   uint32_t count;
42   bool has_immutable_samplers;
43};
44
45struct vn_descriptor_set_layout {
46   struct vn_object_base base;
47
48   struct vn_refcount refcount;
49
50   uint32_t last_binding;
51   bool has_variable_descriptor_count;
52
53   /* bindings must be the last field in the layout */
54   struct vn_descriptor_set_layout_binding bindings[];
55};
56VK_DEFINE_NONDISP_HANDLE_CASTS(vn_descriptor_set_layout,
57                               base.base,
58                               VkDescriptorSetLayout,
59                               VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT)
60
61struct vn_descriptor_pool_state {
62   uint32_t set_count;
63   uint32_t iub_binding_count;
64   uint32_t descriptor_counts[VN_NUM_DESCRIPTOR_TYPES];
65};
66
67struct vn_descriptor_pool {
68   struct vn_object_base base;
69
70   VkAllocationCallbacks allocator;
71   bool async_set_allocation;
72   struct vn_descriptor_pool_state max;
73   struct vn_descriptor_pool_state used;
74
75   struct list_head descriptor_sets;
76};
77VK_DEFINE_NONDISP_HANDLE_CASTS(vn_descriptor_pool,
78                               base.base,
79                               VkDescriptorPool,
80                               VK_OBJECT_TYPE_DESCRIPTOR_POOL)
81
82struct vn_update_descriptor_sets {
83   uint32_t write_count;
84   VkWriteDescriptorSet *writes;
85   VkDescriptorImageInfo *images;
86   VkDescriptorBufferInfo *buffers;
87   VkBufferView *views;
88   VkWriteDescriptorSetInlineUniformBlock *iubs;
89};
90
91struct vn_descriptor_set {
92   struct vn_object_base base;
93
94   struct vn_descriptor_set_layout *layout;
95   uint32_t last_binding_descriptor_count;
96
97   struct list_head head;
98};
99VK_DEFINE_NONDISP_HANDLE_CASTS(vn_descriptor_set,
100                               base.base,
101                               VkDescriptorSet,
102                               VK_OBJECT_TYPE_DESCRIPTOR_SET)
103
104struct vn_descriptor_update_template_entry {
105   size_t offset;
106   size_t stride;
107};
108
109struct vn_descriptor_update_template {
110   struct vn_object_base base;
111
112   mtx_t mutex;
113   struct vn_update_descriptor_sets *update;
114
115   struct vn_descriptor_update_template_entry entries[];
116};
117VK_DEFINE_NONDISP_HANDLE_CASTS(vn_descriptor_update_template,
118                               base.base,
119                               VkDescriptorUpdateTemplate,
120                               VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE)
121
122#endif /* VN_DESCRIPTOR_SET_H */
123