blob: 584bb0019e6a03ff1eeeb74b8e5fa2b74299bb43 [file] [log] [blame]
Chia-I Wuf8385062015-01-04 16:27:24 +08001/*
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06002 * Vulkan
Chia-I Wuf8385062015-01-04 16:27:24 +08003 *
4 * Copyright (C) 2015 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *
24 * Authors:
25 * Chia-I Wu <olv@lunarg.com>
26 */
27
28#ifndef DESC_H
29#define DESC_H
30
31#include "intel.h"
32#include "obj.h"
33
34struct intel_cmd;
35struct intel_dev;
36
37/**
38 * Opaque descriptors.
39 */
40struct intel_desc_surface;
41struct intel_desc_sampler;
42
43/**
Chia-I Wu8d24b3b2015-03-26 13:14:16 +080044 * Descriptor region offset (or size) in bytes.
Chia-I Wuf8385062015-01-04 16:27:24 +080045 */
46struct intel_desc_offset {
47 uint32_t surface;
48 uint32_t sampler;
49};
50
Chia-I Wu7732cb22015-03-26 15:27:55 +080051struct intel_desc_iter {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060052 VkDescriptorType type;
Chia-I Wu7732cb22015-03-26 15:27:55 +080053 struct intel_desc_offset increment;
54 uint32_t size;
55
56 struct intel_desc_offset begin;
57 struct intel_desc_offset end;
58 uint32_t cur;
59};
60
Chia-I Wuf8385062015-01-04 16:27:24 +080061/**
Chia-I Wu8d24b3b2015-03-26 13:14:16 +080062 * Per-device descriptor region.
Chia-I Wuf8385062015-01-04 16:27:24 +080063 */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +080064struct intel_desc_region {
Chia-I Wuf8385062015-01-04 16:27:24 +080065 /* this is not an intel_obj */
66
67 uint32_t surface_desc_size;
68 uint32_t sampler_desc_size;
69
70 /* surface descriptors (in system memory until RS is enabled) */
71 struct intel_desc_surface *surfaces;
72 /* sampler desciptors */
73 struct intel_desc_sampler *samplers;
74
75 struct intel_desc_offset size;
76 struct intel_desc_offset cur;
77};
78
Chia-I Wu8d24b3b2015-03-26 13:14:16 +080079struct intel_desc_pool {
Chia-I Wuf8385062015-01-04 16:27:24 +080080 struct intel_obj obj;
81
82 struct intel_dev *dev;
83
Chia-I Wu8d24b3b2015-03-26 13:14:16 +080084 /* point to a continuous area in the device's region */
85 struct intel_desc_offset region_begin;
86 struct intel_desc_offset region_end;
Chia-I Wuf8385062015-01-04 16:27:24 +080087
88 struct intel_desc_offset cur;
89};
90
91struct intel_desc_layout;
92
93struct intel_desc_set {
94 struct intel_obj obj;
95
Chia-I Wu8d24b3b2015-03-26 13:14:16 +080096 /* suballocated from a pool */
97 struct intel_desc_region *region;
98 struct intel_desc_offset region_begin;
99 struct intel_desc_offset region_end;
Chia-I Wuf8385062015-01-04 16:27:24 +0800100
101 const struct intel_desc_layout *layout;
102};
103
104struct intel_desc_layout {
105 struct intel_obj obj;
106
Chia-I Wufc9d9132015-03-26 15:04:41 +0800107 /* homogeneous bindings in this layout */
108 struct intel_desc_layout_binding {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600109 VkDescriptorType type;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800110 uint32_t array_size;
Chia-I Wu310eece2015-03-27 12:56:09 +0800111 const struct intel_sampler **immutable_samplers;
112 const struct intel_sampler *shared_immutable_sampler;
Chia-I Wuf8385062015-01-04 16:27:24 +0800113
Chia-I Wu7732cb22015-03-26 15:27:55 +0800114 /* to initialize intel_desc_iter */
Chia-I Wuf8385062015-01-04 16:27:24 +0800115 struct intel_desc_offset offset;
116 struct intel_desc_offset increment;
Chia-I Wufc9d9132015-03-26 15:04:41 +0800117 } *bindings;
118 uint32_t binding_count;
Chia-I Wuf8385062015-01-04 16:27:24 +0800119
120 /* count of _DYNAMIC descriptors */
121 uint32_t dynamic_desc_count;
122
Chia-I Wu7732cb22015-03-26 15:27:55 +0800123 /* the size of the layout in the region */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800124 struct intel_desc_offset region_size;
Chia-I Wuf8385062015-01-04 16:27:24 +0800125};
126
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500127struct intel_pipeline_layout {
Chia-I Wu7732cb22015-03-26 15:27:55 +0800128 struct intel_obj obj;
Chia-I Wuf8385062015-01-04 16:27:24 +0800129
Chia-I Wu7732cb22015-03-26 15:27:55 +0800130 struct intel_desc_layout **layouts;
Chia-I Wu862c5572015-03-28 15:23:55 +0800131 uint32_t *dynamic_desc_indices;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800132 uint32_t layout_count;
Chia-I Wu862c5572015-03-28 15:23:55 +0800133
134 uint32_t total_dynamic_desc_count;
Chia-I Wuf8385062015-01-04 16:27:24 +0800135};
136
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600137static inline struct intel_desc_pool *intel_desc_pool(VkDescriptorPool pool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800138{
Tony Barbourde4124d2015-07-03 10:33:54 -0600139 return *(struct intel_desc_pool **) &pool;
Chia-I Wuf8385062015-01-04 16:27:24 +0800140}
141
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800142static inline struct intel_desc_pool *intel_desc_pool_from_obj(struct intel_obj *obj)
Chia-I Wuf8385062015-01-04 16:27:24 +0800143{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800144 return (struct intel_desc_pool *) obj;
Chia-I Wuf8385062015-01-04 16:27:24 +0800145}
146
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600147static inline struct intel_desc_set *intel_desc_set(VkDescriptorSet set)
Chia-I Wuf8385062015-01-04 16:27:24 +0800148{
Tony Barbourde4124d2015-07-03 10:33:54 -0600149 return *(struct intel_desc_set **) &set;
Chia-I Wuf8385062015-01-04 16:27:24 +0800150}
151
152static inline struct intel_desc_set *intel_desc_set_from_obj(struct intel_obj *obj)
153{
154 return (struct intel_desc_set *) obj;
155}
156
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600157static inline struct intel_desc_layout *intel_desc_layout(VkDescriptorSetLayout layout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800158{
Tony Barbourde4124d2015-07-03 10:33:54 -0600159 return *(struct intel_desc_layout **) &layout;
Chia-I Wuf8385062015-01-04 16:27:24 +0800160}
161
162static inline struct intel_desc_layout *intel_desc_layout_from_obj(struct intel_obj *obj)
163{
164 return (struct intel_desc_layout *) obj;
165}
166
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500167static inline struct intel_pipeline_layout *intel_pipeline_layout(VkPipelineLayout pipeline_layout)
Chia-I Wu7732cb22015-03-26 15:27:55 +0800168{
Tony Barbourde4124d2015-07-03 10:33:54 -0600169 return *(struct intel_pipeline_layout **) &pipeline_layout;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800170}
171
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500172static inline struct intel_pipeline_layout *intel_pipeline_layout_from_obj(struct intel_obj *obj)
Chia-I Wu7732cb22015-03-26 15:27:55 +0800173{
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500174 return (struct intel_pipeline_layout *) obj;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800175}
176
Chia-I Wuf8385062015-01-04 16:27:24 +0800177static inline void intel_desc_offset_set(struct intel_desc_offset *offset,
178 uint32_t surface_offset,
179 uint32_t sampler_offset)
180{
181 offset->surface = surface_offset;
182 offset->sampler = sampler_offset;
183}
184
185static inline void intel_desc_offset_add(struct intel_desc_offset *offset,
186 const struct intel_desc_offset *lhs,
187 const struct intel_desc_offset *rhs)
188{
189 offset->surface = lhs->surface + rhs->surface;
190 offset->sampler = lhs->sampler + rhs->sampler;
191}
192
193static inline void intel_desc_offset_sub(struct intel_desc_offset *offset,
194 const struct intel_desc_offset *lhs,
195 const struct intel_desc_offset *rhs)
196{
197 offset->surface = lhs->surface - rhs->surface;
198 offset->sampler = lhs->sampler - rhs->sampler;
199}
200
201static inline void intel_desc_offset_mad(struct intel_desc_offset *offset,
202 const struct intel_desc_offset *lhs,
203 const struct intel_desc_offset *rhs,
204 uint32_t lhs_scale)
205{
206 offset->surface = lhs->surface * lhs_scale + rhs->surface;
207 offset->sampler = lhs->sampler * lhs_scale + rhs->sampler;
208}
209
210static inline bool intel_desc_offset_within(const struct intel_desc_offset *offset,
211 const struct intel_desc_offset *other)
212{
213 return (offset->surface <= other->surface &&
214 offset->sampler <= other->sampler);
215}
216
Chia-I Wu7732cb22015-03-26 15:27:55 +0800217bool intel_desc_iter_init_for_binding(struct intel_desc_iter *iter,
218 const struct intel_desc_layout *layout,
219 uint32_t binding_index, uint32_t array_base);
220
221bool intel_desc_iter_advance(struct intel_desc_iter *iter);
222
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600223VkResult intel_desc_region_create(struct intel_dev *dev,
Chia-I Wuf8385062015-01-04 16:27:24 +0800224 struct intel_desc_region **region_ret);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800225void intel_desc_region_destroy(struct intel_dev *dev,
226 struct intel_desc_region *region);
Chia-I Wuf8385062015-01-04 16:27:24 +0800227
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600228VkResult intel_desc_region_alloc(struct intel_desc_region *region,
Norbert Nopper4077e7a2015-08-15 15:07:38 +0200229 uint32_t max_sets,
230 const VkDescriptorPoolCreateInfo *info,
231 struct intel_desc_offset *begin,
232 struct intel_desc_offset *end);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800233void intel_desc_region_free(struct intel_desc_region *region,
234 const struct intel_desc_offset *begin,
235 const struct intel_desc_offset *end);
236
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800237void intel_desc_region_clear(struct intel_desc_region *region,
238 const struct intel_desc_offset *begin,
239 const struct intel_desc_offset *end);
240
241void intel_desc_region_update(struct intel_desc_region *region,
242 const struct intel_desc_offset *begin,
243 const struct intel_desc_offset *end,
244 const struct intel_desc_surface *surfaces,
245 const struct intel_desc_sampler *samplers);
246
247void intel_desc_region_copy(struct intel_desc_region *region,
248 const struct intel_desc_offset *begin,
249 const struct intel_desc_offset *end,
250 const struct intel_desc_offset *src);
251
Chia-I Wu862c5572015-03-28 15:23:55 +0800252void intel_desc_region_read_surface(const struct intel_desc_region *region,
253 const struct intel_desc_offset *offset,
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -0600254 VkShaderStageFlagBits stage,
Chia-I Wu862c5572015-03-28 15:23:55 +0800255 const struct intel_mem **mem,
256 bool *read_only,
257 const uint32_t **cmd,
258 uint32_t *cmd_len);
259void intel_desc_region_read_sampler(const struct intel_desc_region *region,
260 const struct intel_desc_offset *offset,
261 const struct intel_sampler **sampler);
262
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600263VkResult intel_desc_pool_create(struct intel_dev *dev,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600264 const VkDescriptorPoolCreateInfo *info,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800265 struct intel_desc_pool **pool_ret);
266void intel_desc_pool_destroy(struct intel_desc_pool *pool);
267
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600268VkResult intel_desc_pool_alloc(struct intel_desc_pool *pool,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800269 const struct intel_desc_layout *layout,
270 struct intel_desc_offset *begin,
271 struct intel_desc_offset *end);
Chia-I Wudee95612015-03-26 15:23:52 +0800272void intel_desc_pool_reset(struct intel_desc_pool *pool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800273
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600274VkResult intel_desc_set_create(struct intel_dev *dev,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800275 struct intel_desc_pool *pool,
Chia-I Wuf8385062015-01-04 16:27:24 +0800276 const struct intel_desc_layout *layout,
277 struct intel_desc_set **set_ret);
278void intel_desc_set_destroy(struct intel_desc_set *set);
279
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600280VkResult intel_desc_layout_create(struct intel_dev *dev,
281 const VkDescriptorSetLayoutCreateInfo *info,
Chia-I Wuf8385062015-01-04 16:27:24 +0800282 struct intel_desc_layout **layout_ret);
283void intel_desc_layout_destroy(struct intel_desc_layout *layout);
284
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500285VkResult intel_pipeline_layout_create(struct intel_dev *dev,
286 const VkPipelineLayoutCreateInfo *pPipelineCreateInfo,
287 struct intel_pipeline_layout **pipeline_layout_ret);
288void intel_pipeline_layout_destroy(struct intel_pipeline_layout *pipeline_layout);
Chia-I Wuf8385062015-01-04 16:27:24 +0800289
290#endif /* DESC_H */