1 /*
2  * Copyright © 2016 Bas Nieuwenhuizen
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  */
23 
24 #ifndef TU_DESCRIPTOR_SET_H
25 #define TU_DESCRIPTOR_SET_H
26 
27 #include <vulkan/vulkan.h>
28 
29 /* The hardware supports 5 descriptor sets, but we reserve 1 for dynamic
30  * descriptors and input attachments.
31  */
32 #define MAX_SETS 4
33 
34 struct tu_descriptor_set_binding_layout
35 {
36    VkDescriptorType type;
37 
38    /* Number of array elements in this binding */
39    uint32_t array_size;
40 
41    /* The size in bytes of each Vulkan descriptor. */
42    uint32_t size;
43 
44    uint32_t offset;
45 
46    /* For descriptors that point to a buffer, index into the array of BO's to
47     * be added to the cmdbuffer's used BO list.
48     */
49    uint32_t buffer_offset;
50 
51    /* Index into the pDynamicOffsets array for dynamic descriptors, as well as
52     * the array of dynamic descriptors (offsetted by
53     * tu_pipeline_layout::set::dynamic_offset_start).
54     */
55    uint32_t dynamic_offset_offset;
56 
57    /* Offset in the tu_descriptor_set_layout of the immutable samplers, or 0
58     * if there are no immutable samplers. */
59    uint32_t immutable_samplers_offset;
60 
61    /* Offset in the tu_descriptor_set_layout of the ycbcr samplers, or 0
62     * if there are no immutable samplers. */
63    uint32_t ycbcr_samplers_offset;
64 
65    /* Shader stages that use this binding */
66    uint32_t shader_stages;
67 };
68 
69 struct tu_descriptor_set_layout
70 {
71    struct vk_object_base base;
72 
73    /* The create flags for this descriptor set layout */
74    VkDescriptorSetLayoutCreateFlags flags;
75 
76    /* Number of bindings in this descriptor set */
77    uint32_t binding_count;
78 
79    /* Total size of the descriptor set with room for all array entries */
80    uint32_t size;
81 
82    /* Shader stages affected by this descriptor set */
83    uint16_t shader_stages;
84 
85    /* Number of dynamic offsets used by this descriptor set */
86    uint16_t dynamic_offset_count;
87 
88    /* A bitfield of which dynamic buffers are ubo's, to make the
89     * descriptor-binding-time patching easier.
90     */
91    uint32_t dynamic_ubo;
92 
93    uint32_t buffer_count;
94 
95    bool has_immutable_samplers;
96    bool has_variable_descriptors;
97 
98    /* Bindings in this descriptor set */
99    struct tu_descriptor_set_binding_layout binding[0];
100 };
101 
102 struct tu_pipeline_layout
103 {
104    struct vk_object_base base;
105 
106    struct
107    {
108       struct tu_descriptor_set_layout *layout;
109       uint32_t size;
110       uint32_t dynamic_offset_start;
111    } set[MAX_SETS];
112 
113    uint32_t num_sets;
114    uint32_t push_constant_size;
115    uint32_t dynamic_offset_count;
116 
117    unsigned char sha1[20];
118 };
119 
120 static inline const uint32_t *
tu_immutable_samplers(const struct tu_descriptor_set_layout * set,const struct tu_descriptor_set_binding_layout * binding)121 tu_immutable_samplers(const struct tu_descriptor_set_layout *set,
122                       const struct tu_descriptor_set_binding_layout *binding)
123 {
124    return (void *) ((const char *) set + binding->immutable_samplers_offset);
125 }
126 
127 static inline const struct tu_sampler_ycbcr_conversion *
tu_immutable_ycbcr_samplers(const struct tu_descriptor_set_layout * set,const struct tu_descriptor_set_binding_layout * binding)128 tu_immutable_ycbcr_samplers(const struct tu_descriptor_set_layout *set,
129                             const struct tu_descriptor_set_binding_layout *binding)
130 {
131    if (!binding->ycbcr_samplers_offset)
132       return NULL;
133 
134    return (void *) ((const char *) set + binding->ycbcr_samplers_offset);
135 }
136 
137 #endif /* TU_DESCRIPTOR_SET_H */
138