blob: e7c31c36893b4f1ccd26d3df89b87367286c1c16 [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#include "buf.h"
29#include "cmd.h"
30#include "dev.h"
31#include "gpu.h"
32#include "img.h"
33#include "sampler.h"
34#include "view.h"
35#include "desc.h"
36
37enum intel_desc_surface_type {
38 INTEL_DESC_SURFACE_UNUSED,
39 INTEL_DESC_SURFACE_BUF,
40 INTEL_DESC_SURFACE_IMG,
41};
42
43struct intel_desc_surface {
44 const struct intel_mem *mem;
45 bool read_only;
46
47 enum intel_desc_surface_type type;
48 union {
49 const void *unused;
50 const struct intel_buf_view *buf;
51 const struct intel_img_view *img;
52 } u;
53};
54
55struct intel_desc_sampler {
56 const struct intel_sampler *sampler;
57};
58
Chia-I Wu7732cb22015-03-26 15:27:55 +080059bool intel_desc_iter_init_for_binding(struct intel_desc_iter *iter,
60 const struct intel_desc_layout *layout,
61 uint32_t binding_index, uint32_t array_base)
62{
63 const struct intel_desc_layout_binding *binding;
64
65 if (binding_index >= layout->binding_count ||
66 array_base >= layout->bindings[binding_index].array_size)
67 return false;
68
69 binding = &layout->bindings[binding_index];
70
71 iter->type = binding->type;
72 iter->increment = binding->increment;
73 iter->size = binding->array_size;
74
75 intel_desc_offset_mad(&iter->begin, &binding->increment,
76 &binding->offset, array_base);
77 intel_desc_offset_add(&iter->end, &iter->begin, &binding->increment);
78 iter->cur = array_base;
79
80 return true;
81}
82
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +080083static bool desc_iter_init_for_writing(struct intel_desc_iter *iter,
84 const struct intel_desc_set *set,
85 uint32_t binding_index, uint32_t array_base)
Chia-I Wu7732cb22015-03-26 15:27:55 +080086{
87 if (!intel_desc_iter_init_for_binding(iter, set->layout,
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +080088 binding_index, array_base))
Chia-I Wu7732cb22015-03-26 15:27:55 +080089 return false;
90
91 intel_desc_offset_add(&iter->begin, &iter->begin, &set->region_begin);
92 intel_desc_offset_add(&iter->end, &iter->end, &set->region_begin);
93
94 return true;
95}
96
97bool intel_desc_iter_advance(struct intel_desc_iter *iter)
98{
99 if (iter->cur >= iter->size)
100 return false;
101
102 iter->cur++;
103
104 iter->begin = iter->end;
105 intel_desc_offset_add(&iter->end, &iter->end, &iter->increment);
106
107 return true;
108}
109
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800110static bool desc_region_init_desc_sizes(struct intel_desc_region *region,
111 const struct intel_gpu *gpu)
Chia-I Wuf8385062015-01-04 16:27:24 +0800112{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800113 region->surface_desc_size = sizeof(struct intel_desc_surface);
114 region->sampler_desc_size = sizeof(struct intel_desc_sampler);
Chia-I Wuf8385062015-01-04 16:27:24 +0800115
116 return true;
117}
118
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600119VkResult intel_desc_region_create(struct intel_dev *dev,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800120 struct intel_desc_region **region_ret)
Chia-I Wuf8385062015-01-04 16:27:24 +0800121{
Mike Stroyanaaabdcc2015-07-28 10:55:29 -0600122 const uint32_t surface_count = 1024*1024;
123 const uint32_t sampler_count = 1024*1024;
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800124 struct intel_desc_region *region;
Chia-I Wuf8385062015-01-04 16:27:24 +0800125
Tony Barbour8205d902015-04-16 15:59:00 -0600126 region = intel_alloc(dev, sizeof(*region), 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800127 if (!region)
Tony Barbour8205d902015-04-16 15:59:00 -0600128 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800129
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800130 memset(region, 0, sizeof(*region));
Chia-I Wuf8385062015-01-04 16:27:24 +0800131
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800132 if (!desc_region_init_desc_sizes(region, dev->gpu)) {
133 intel_free(dev, region);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600134 return VK_ERROR_UNKNOWN;
Chia-I Wuf8385062015-01-04 16:27:24 +0800135 }
136
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800137 intel_desc_offset_set(&region->size,
138 region->surface_desc_size * surface_count,
139 region->sampler_desc_size * sampler_count);
Chia-I Wuf8385062015-01-04 16:27:24 +0800140
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800141 region->surfaces = intel_alloc(dev, region->size.surface,
Tony Barbour8205d902015-04-16 15:59:00 -0600142 64, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800143 if (!region->surfaces) {
144 intel_free(dev, region);
Tony Barbour8205d902015-04-16 15:59:00 -0600145 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800146 }
147
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800148 region->samplers = intel_alloc(dev, region->size.sampler,
Tony Barbour8205d902015-04-16 15:59:00 -0600149 64, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800150 if (!region->samplers) {
151 intel_free(dev, region->surfaces);
152 intel_free(dev, region);
Tony Barbour8205d902015-04-16 15:59:00 -0600153 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800154 }
155
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800156 *region_ret = region;
Chia-I Wuf8385062015-01-04 16:27:24 +0800157
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600158 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800159}
160
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800161void intel_desc_region_destroy(struct intel_dev *dev,
162 struct intel_desc_region *region)
Chia-I Wuf8385062015-01-04 16:27:24 +0800163{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800164 intel_free(dev, region->samplers);
165 intel_free(dev, region->surfaces);
166 intel_free(dev, region);
Chia-I Wuf8385062015-01-04 16:27:24 +0800167}
168
169/**
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800170 * Get the size of a descriptor in the region.
Chia-I Wuf8385062015-01-04 16:27:24 +0800171 */
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600172static VkResult desc_region_get_desc_size(const struct intel_desc_region *region,
173 VkDescriptorType type,
Chia-I Wuf8385062015-01-04 16:27:24 +0800174 struct intel_desc_offset *size)
175{
176 uint32_t surface_size = 0, sampler_size = 0;
177
178 switch (type) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600179 case VK_DESCRIPTOR_TYPE_SAMPLER:
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800180 sampler_size = region->sampler_desc_size;
Chia-I Wuf8385062015-01-04 16:27:24 +0800181 break;
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600182 case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800183 surface_size = region->surface_desc_size;
184 sampler_size = region->sampler_desc_size;
Chia-I Wuf8385062015-01-04 16:27:24 +0800185 break;
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600186 case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
187 case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
188 case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
189 case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600190 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600191 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600192 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600193 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800194 surface_size = region->surface_desc_size;
Chia-I Wuf8385062015-01-04 16:27:24 +0800195 break;
196 default:
197 assert(!"unknown descriptor type");
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600198 return VK_ERROR_INVALID_VALUE;
Chia-I Wuf8385062015-01-04 16:27:24 +0800199 break;
200 }
201
202 intel_desc_offset_set(size, surface_size, sampler_size);
203
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600204 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800205}
206
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600207VkResult intel_desc_region_alloc(struct intel_desc_region *region,
Norbert Nopper4077e7a2015-08-15 15:07:38 +0200208 uint32_t max_sets,
209 const VkDescriptorPoolCreateInfo *info,
210 struct intel_desc_offset *begin,
211 struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800212{
213 uint32_t surface_size = 0, sampler_size = 0;
214 struct intel_desc_offset alloc;
215 uint32_t i;
216
217 /* calculate sizes needed */
218 for (i = 0; i < info->count; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600219 const VkDescriptorTypeCount *tc = &info->pTypeCount[i];
Chia-I Wuf8385062015-01-04 16:27:24 +0800220 struct intel_desc_offset size;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600221 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800222
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800223 ret = desc_region_get_desc_size(region, tc->type, &size);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600224 if (ret != VK_SUCCESS)
Chia-I Wuf8385062015-01-04 16:27:24 +0800225 return ret;
226
227 surface_size += size.surface * tc->count;
228 sampler_size += size.sampler * tc->count;
229 }
230
Norbert Nopper4077e7a2015-08-15 15:07:38 +0200231 surface_size *= max_sets;
232 sampler_size *= max_sets;
233
Chia-I Wuf8385062015-01-04 16:27:24 +0800234 intel_desc_offset_set(&alloc, surface_size, sampler_size);
235
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800236 *begin = region->cur;
237 intel_desc_offset_add(end, &region->cur, &alloc);
Chia-I Wuf8385062015-01-04 16:27:24 +0800238
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800239 if (!intel_desc_offset_within(end, &region->size))
Tony Barbour8205d902015-04-16 15:59:00 -0600240 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800241
242 /* increment the writer pointer */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800243 region->cur = *end;
Chia-I Wuf8385062015-01-04 16:27:24 +0800244
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600245 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800246}
247
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800248static void desc_region_validate_begin_end(const struct intel_desc_region *region,
249 const struct intel_desc_offset *begin,
250 const struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800251{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800252 assert(begin->surface % region->surface_desc_size == 0 &&
253 begin->sampler % region->sampler_desc_size == 0);
254 assert(end->surface % region->surface_desc_size == 0 &&
255 end->sampler % region->sampler_desc_size == 0);
256 assert(intel_desc_offset_within(end, &region->size));
Chia-I Wuf8385062015-01-04 16:27:24 +0800257}
258
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800259void intel_desc_region_free(struct intel_desc_region *region,
260 const struct intel_desc_offset *begin,
261 const struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800262{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800263 desc_region_validate_begin_end(region, begin, end);
Chia-I Wuf8385062015-01-04 16:27:24 +0800264
265 /* is it ok not to reclaim? */
266}
267
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800268void intel_desc_region_update(struct intel_desc_region *region,
269 const struct intel_desc_offset *begin,
270 const struct intel_desc_offset *end,
271 const struct intel_desc_surface *surfaces,
272 const struct intel_desc_sampler *samplers)
Chia-I Wuf8385062015-01-04 16:27:24 +0800273{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800274 desc_region_validate_begin_end(region, begin, end);
Chia-I Wuf8385062015-01-04 16:27:24 +0800275
276 if (begin->surface < end->surface) {
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800277 memcpy((char *) region->surfaces + begin->surface, surfaces,
Chia-I Wuf8385062015-01-04 16:27:24 +0800278 end->surface - begin->surface);
279 }
280
281 if (begin->sampler < end->sampler) {
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800282 memcpy((char *) region->samplers + begin->sampler, samplers,
Chia-I Wuf8385062015-01-04 16:27:24 +0800283 end->sampler - begin->sampler);
284 }
285}
286
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800287void intel_desc_region_copy(struct intel_desc_region *region,
288 const struct intel_desc_offset *begin,
289 const struct intel_desc_offset *end,
290 const struct intel_desc_offset *src)
Chia-I Wuf8385062015-01-04 16:27:24 +0800291{
292 struct intel_desc_offset src_end;
293 const struct intel_desc_surface *surfaces;
294 const struct intel_desc_sampler *samplers;
295
296 /* no overlap */
297 assert(intel_desc_offset_within(src, begin) ||
298 intel_desc_offset_within(end, src));
299
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800300 /* no read past region */
Chia-I Wuf8385062015-01-04 16:27:24 +0800301 intel_desc_offset_sub(&src_end, end, begin);
302 intel_desc_offset_add(&src_end, src, &src_end);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800303 assert(intel_desc_offset_within(&src_end, &region->size));
Chia-I Wuf8385062015-01-04 16:27:24 +0800304
305 surfaces = (const struct intel_desc_surface *)
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800306 ((const char *) region->surfaces + src->surface);
Tony Barbour379e0a72015-02-05 11:09:34 -0700307 samplers = (const struct intel_desc_sampler *)
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800308 ((const char *) region->samplers + src->sampler);
Chia-I Wuf8385062015-01-04 16:27:24 +0800309
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800310 intel_desc_region_update(region, begin, end, surfaces, samplers);
Chia-I Wuf8385062015-01-04 16:27:24 +0800311}
312
Chia-I Wu862c5572015-03-28 15:23:55 +0800313void intel_desc_region_read_surface(const struct intel_desc_region *region,
314 const struct intel_desc_offset *offset,
Tony Barbour8205d902015-04-16 15:59:00 -0600315 VkShaderStage stage,
Chia-I Wu862c5572015-03-28 15:23:55 +0800316 const struct intel_mem **mem,
317 bool *read_only,
318 const uint32_t **cmd,
319 uint32_t *cmd_len)
320{
321 const struct intel_desc_surface *desc;
322 struct intel_desc_offset end;
323
324 intel_desc_offset_set(&end,
325 offset->surface + region->surface_desc_size, offset->sampler);
326 desc_region_validate_begin_end(region, offset, &end);
327
328 desc = (const struct intel_desc_surface *)
329 ((const char *) region->surfaces + offset->surface);
330
331 *mem = desc->mem;
332 *read_only = desc->read_only;
333 switch (desc->type) {
334 case INTEL_DESC_SURFACE_BUF:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600335 *cmd = (stage == VK_SHADER_STAGE_FRAGMENT) ?
Chia-I Wu862c5572015-03-28 15:23:55 +0800336 desc->u.buf->fs_cmd : desc->u.buf->cmd;
337 *cmd_len = desc->u.buf->cmd_len;
338 break;
339 case INTEL_DESC_SURFACE_IMG:
340 *cmd = desc->u.img->cmd;
341 *cmd_len = desc->u.img->cmd_len;
342 break;
343 case INTEL_DESC_SURFACE_UNUSED:
344 default:
345 *cmd = NULL;
346 *cmd_len = 0;
347 break;
348 }
349}
350
351void intel_desc_region_read_sampler(const struct intel_desc_region *region,
352 const struct intel_desc_offset *offset,
353 const struct intel_sampler **sampler)
354{
355 const struct intel_desc_sampler *desc;
356 struct intel_desc_offset end;
357
358 intel_desc_offset_set(&end,
359 offset->surface, offset->sampler + region->sampler_desc_size);
360 desc_region_validate_begin_end(region, offset, &end);
361
362 desc = (const struct intel_desc_sampler *)
363 ((const char *) region->samplers + offset->sampler);
364
365 *sampler = desc->sampler;
366}
367
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800368static void desc_pool_destroy(struct intel_obj *obj)
Chia-I Wuf8385062015-01-04 16:27:24 +0800369{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800370 struct intel_desc_pool *pool = intel_desc_pool_from_obj(obj);
Chia-I Wuf8385062015-01-04 16:27:24 +0800371
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800372 intel_desc_pool_destroy(pool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800373}
374
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600375VkResult intel_desc_pool_create(struct intel_dev *dev,
376 VkDescriptorPoolUsage usage,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800377 uint32_t max_sets,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600378 const VkDescriptorPoolCreateInfo *info,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800379 struct intel_desc_pool **pool_ret)
Chia-I Wuf8385062015-01-04 16:27:24 +0800380{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800381 struct intel_desc_pool *pool;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600382 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800383
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800384 pool = (struct intel_desc_pool *) intel_base_create(&dev->base.handle,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600385 sizeof(*pool), dev->base.dbg, VK_OBJECT_TYPE_DESCRIPTOR_POOL,
Chia-I Wu545c2e12015-02-22 13:19:54 +0800386 info, 0);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800387 if (!pool)
Tony Barbour8205d902015-04-16 15:59:00 -0600388 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800389
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800390 pool->dev = dev;
Chia-I Wuf8385062015-01-04 16:27:24 +0800391
Norbert Nopper4077e7a2015-08-15 15:07:38 +0200392 ret = intel_desc_region_alloc(dev->desc_region, max_sets, info,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800393 &pool->region_begin, &pool->region_end);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600394 if (ret != VK_SUCCESS) {
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800395 intel_base_destroy(&pool->obj.base);
Chia-I Wuf8385062015-01-04 16:27:24 +0800396 return ret;
397 }
398
399 /* point to head */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800400 pool->cur = pool->region_begin;
Chia-I Wuf8385062015-01-04 16:27:24 +0800401
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800402 pool->obj.destroy = desc_pool_destroy;
Chia-I Wuf8385062015-01-04 16:27:24 +0800403
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800404 *pool_ret = pool;
Chia-I Wuf8385062015-01-04 16:27:24 +0800405
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600406 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800407}
408
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800409void intel_desc_pool_destroy(struct intel_desc_pool *pool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800410{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800411 intel_desc_region_free(pool->dev->desc_region,
412 &pool->region_begin, &pool->region_end);
413 intel_base_destroy(&pool->obj.base);
Chia-I Wuf8385062015-01-04 16:27:24 +0800414}
415
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600416VkResult intel_desc_pool_alloc(struct intel_desc_pool *pool,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800417 const struct intel_desc_layout *layout,
418 struct intel_desc_offset *begin,
419 struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800420{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800421 *begin = pool->cur;
422 intel_desc_offset_add(end, &pool->cur, &layout->region_size);
Chia-I Wuf8385062015-01-04 16:27:24 +0800423
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800424 if (!intel_desc_offset_within(end, &pool->region_end))
Tony Barbour8205d902015-04-16 15:59:00 -0600425 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800426
427 /* increment the writer pointer */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800428 pool->cur = *end;
Chia-I Wuf8385062015-01-04 16:27:24 +0800429
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600430 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800431}
432
Chia-I Wudee95612015-03-26 15:23:52 +0800433void intel_desc_pool_reset(struct intel_desc_pool *pool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800434{
435 /* reset to head */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800436 pool->cur = pool->region_begin;
Chia-I Wuf8385062015-01-04 16:27:24 +0800437}
438
439static void desc_set_destroy(struct intel_obj *obj)
440{
441 struct intel_desc_set *set = intel_desc_set_from_obj(obj);
442
443 intel_desc_set_destroy(set);
444}
445
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600446VkResult intel_desc_set_create(struct intel_dev *dev,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800447 struct intel_desc_pool *pool,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600448 VkDescriptorSetUsage usage,
Chia-I Wuf8385062015-01-04 16:27:24 +0800449 const struct intel_desc_layout *layout,
450 struct intel_desc_set **set_ret)
451{
452 struct intel_desc_set *set;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600453 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800454
Chia-I Wu545c2e12015-02-22 13:19:54 +0800455 set = (struct intel_desc_set *) intel_base_create(&dev->base.handle,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600456 sizeof(*set), dev->base.dbg, VK_OBJECT_TYPE_DESCRIPTOR_SET,
Chia-I Wu545c2e12015-02-22 13:19:54 +0800457 NULL, 0);
Chia-I Wuf8385062015-01-04 16:27:24 +0800458 if (!set)
Tony Barbour8205d902015-04-16 15:59:00 -0600459 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800460
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800461 set->region = dev->desc_region;
462 ret = intel_desc_pool_alloc(pool, layout,
463 &set->region_begin, &set->region_end);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600464 if (ret != VK_SUCCESS) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800465 intel_base_destroy(&set->obj.base);
466 return ret;
467 }
468
469 set->layout = layout;
470
471 set->obj.destroy = desc_set_destroy;
472
473 *set_ret = set;
474
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600475 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800476}
477
478void intel_desc_set_destroy(struct intel_desc_set *set)
479{
480 intel_base_destroy(&set->obj.base);
481}
482
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600483static bool desc_set_img_layout_read_only(VkImageLayout layout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800484{
485 switch (layout) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600486 case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
487 case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
488 case VK_IMAGE_LAYOUT_TRANSFER_SOURCE_OPTIMAL:
Chia-I Wuf8385062015-01-04 16:27:24 +0800489 return true;
490 default:
491 return false;
492 }
493}
494
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800495static void desc_set_write_sampler(struct intel_desc_set *set,
496 const struct intel_desc_iter *iter,
497 const struct intel_sampler *sampler)
Chia-I Wuf8385062015-01-04 16:27:24 +0800498{
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800499 struct intel_desc_sampler desc;
Chia-I Wuf8385062015-01-04 16:27:24 +0800500
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800501 desc.sampler = sampler;
502 intel_desc_region_update(set->region, &iter->begin, &iter->end,
503 NULL, &desc);
Chia-I Wuf8385062015-01-04 16:27:24 +0800504}
505
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800506static void desc_set_write_combined_image_sampler(struct intel_desc_set *set,
507 const struct intel_desc_iter *iter,
508 const struct intel_img_view *img_view,
509 VkImageLayout img_layout,
510 const struct intel_sampler *sampler)
Chia-I Wuf8385062015-01-04 16:27:24 +0800511{
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800512 struct intel_desc_surface view_desc;
513 struct intel_desc_sampler sampler_desc;
Chia-I Wuf8385062015-01-04 16:27:24 +0800514
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800515 view_desc.mem = img_view->img->obj.mem;
516 view_desc.read_only = desc_set_img_layout_read_only(img_layout);
517 view_desc.type = INTEL_DESC_SURFACE_IMG;
518 view_desc.u.img = img_view;
Chia-I Wuf8385062015-01-04 16:27:24 +0800519
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800520 sampler_desc.sampler = sampler;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800521
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800522 intel_desc_region_update(set->region, &iter->begin, &iter->end,
523 &view_desc, &sampler_desc);
Chia-I Wuf8385062015-01-04 16:27:24 +0800524}
525
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800526static void desc_set_write_image(struct intel_desc_set *set,
527 const struct intel_desc_iter *iter,
528 const struct intel_img_view *img_view,
529 VkImageLayout img_layout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800530{
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800531 struct intel_desc_surface desc;
Chia-I Wuf8385062015-01-04 16:27:24 +0800532
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800533 desc.mem = img_view->img->obj.mem;
534 desc.read_only = desc_set_img_layout_read_only(img_layout);
535 desc.type = INTEL_DESC_SURFACE_IMG;
536 desc.u.img = img_view;
537 intel_desc_region_update(set->region, &iter->begin, &iter->end,
538 &desc, NULL);
Chia-I Wuf8385062015-01-04 16:27:24 +0800539}
540
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800541static void desc_set_write_buffer(struct intel_desc_set *set,
542 const struct intel_desc_iter *iter,
543 const struct intel_buf_view *buf_view)
Chia-I Wuf8385062015-01-04 16:27:24 +0800544{
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800545 struct intel_desc_surface desc;
Chia-I Wuf8385062015-01-04 16:27:24 +0800546
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800547 desc.mem = buf_view->buf->obj.mem;
548 desc.read_only = false;
549 desc.type = INTEL_DESC_SURFACE_BUF;
550 desc.u.buf = buf_view;
551 intel_desc_region_update(set->region, &iter->begin, &iter->end,
552 &desc, NULL);
Chia-I Wuf8385062015-01-04 16:27:24 +0800553}
554
555static void desc_layout_destroy(struct intel_obj *obj)
556{
557 struct intel_desc_layout *layout = intel_desc_layout_from_obj(obj);
558
559 intel_desc_layout_destroy(layout);
560}
561
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600562static VkResult desc_layout_init_bindings(struct intel_desc_layout *layout,
Chia-I Wufc9d9132015-03-26 15:04:41 +0800563 const struct intel_desc_region *region,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600564 const VkDescriptorSetLayoutCreateInfo *info)
Chia-I Wuf8385062015-01-04 16:27:24 +0800565{
566 struct intel_desc_offset offset;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800567 uint32_t i;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600568 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800569
Chia-I Wu7732cb22015-03-26 15:27:55 +0800570 intel_desc_offset_set(&offset, 0, 0);
Chia-I Wuf8385062015-01-04 16:27:24 +0800571
Chia-I Wufc9d9132015-03-26 15:04:41 +0800572 /* allocate bindings */
573 layout->bindings = intel_alloc(layout, sizeof(layout->bindings[0]) *
Tony Barbour8205d902015-04-16 15:59:00 -0600574 info->count, 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wufc9d9132015-03-26 15:04:41 +0800575 if (!layout->bindings)
Tony Barbour8205d902015-04-16 15:59:00 -0600576 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wufc9d9132015-03-26 15:04:41 +0800577
578 memset(layout->bindings, 0, sizeof(layout->bindings[0]) * info->count);
579 layout->binding_count = info->count;
580
581 /* initialize bindings */
582 for (i = 0; i < info->count; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600583 const VkDescriptorSetLayoutBinding *lb = &info->pBinding[i];
Chia-I Wufc9d9132015-03-26 15:04:41 +0800584 struct intel_desc_layout_binding *binding = &layout->bindings[i];
Chia-I Wuf8385062015-01-04 16:27:24 +0800585 struct intel_desc_offset size;
586
Chia-I Wufc9d9132015-03-26 15:04:41 +0800587 switch (lb->descriptorType) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600588 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600589 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
Chia-I Wud3114a22015-05-25 16:22:52 +0800590 layout->dynamic_desc_count += lb->arraySize;
Chia-I Wufc9d9132015-03-26 15:04:41 +0800591 break;
592 default:
593 break;
594 }
595
Chia-I Wu7732cb22015-03-26 15:27:55 +0800596 /* lb->stageFlags does not gain us anything */
597 binding->type = lb->descriptorType;
Chia-I Wud3114a22015-05-25 16:22:52 +0800598 binding->array_size = lb->arraySize;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800599 binding->offset = offset;
600
Chia-I Wufc9d9132015-03-26 15:04:41 +0800601 ret = desc_region_get_desc_size(region,
602 lb->descriptorType, &size);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600603 if (ret != VK_SUCCESS)
Chia-I Wuf8385062015-01-04 16:27:24 +0800604 return ret;
605
Chia-I Wu310eece2015-03-27 12:56:09 +0800606 binding->increment = size;
607
608 /* copy immutable samplers */
609 if (lb->pImmutableSamplers) {
610 bool shared = true;
611 uint32_t j;
612
Chia-I Wud3114a22015-05-25 16:22:52 +0800613 for (j = 1; j < lb->arraySize; j++) {
Tony Barbourde4124d2015-07-03 10:33:54 -0600614 if (lb->pImmutableSamplers[j].handle != lb->pImmutableSamplers[0].handle) {
Chia-I Wu310eece2015-03-27 12:56:09 +0800615 shared = false;
616 break;
617 }
618 }
619
620 if (shared) {
621 binding->shared_immutable_sampler =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600622 intel_sampler((VkSampler) lb->pImmutableSamplers[0]);
Chia-I Wu310eece2015-03-27 12:56:09 +0800623 /* set sampler offset increment to 0 */
624 intel_desc_offset_set(&binding->increment,
625 binding->increment.surface, 0);
626 } else {
627 binding->immutable_samplers = intel_alloc(layout,
Chia-I Wud3114a22015-05-25 16:22:52 +0800628 sizeof(binding->immutable_samplers[0]) * lb->arraySize,
Tony Barbour8205d902015-04-16 15:59:00 -0600629 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu310eece2015-03-27 12:56:09 +0800630 if (!binding->immutable_samplers)
Tony Barbour8205d902015-04-16 15:59:00 -0600631 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wu310eece2015-03-27 12:56:09 +0800632
Chia-I Wud3114a22015-05-25 16:22:52 +0800633 for (j = 0; j < lb->arraySize; j++) {
Chia-I Wu310eece2015-03-27 12:56:09 +0800634 binding->immutable_samplers[j] =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600635 intel_sampler((VkSampler) lb->pImmutableSamplers[j]);
Chia-I Wu310eece2015-03-27 12:56:09 +0800636 }
637 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800638 }
639
Chia-I Wu7732cb22015-03-26 15:27:55 +0800640 /* increment offset */
Chia-I Wufc9d9132015-03-26 15:04:41 +0800641 intel_desc_offset_mad(&size, &binding->increment, &size,
Chia-I Wud3114a22015-05-25 16:22:52 +0800642 lb->arraySize - 1);
Chia-I Wuf8385062015-01-04 16:27:24 +0800643 intel_desc_offset_add(&offset, &offset, &size);
Chia-I Wuf8385062015-01-04 16:27:24 +0800644 }
645
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800646 layout->region_size = offset;
Chia-I Wuf8385062015-01-04 16:27:24 +0800647
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600648 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800649}
650
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600651VkResult intel_desc_layout_create(struct intel_dev *dev,
652 const VkDescriptorSetLayoutCreateInfo *info,
Chia-I Wuf8385062015-01-04 16:27:24 +0800653 struct intel_desc_layout **layout_ret)
654{
655 struct intel_desc_layout *layout;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600656 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800657
Chia-I Wu545c2e12015-02-22 13:19:54 +0800658 layout = (struct intel_desc_layout *) intel_base_create(&dev->base.handle,
659 sizeof(*layout), dev->base.dbg,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600660 VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, info, 0);
Chia-I Wuf8385062015-01-04 16:27:24 +0800661 if (!layout)
Tony Barbour8205d902015-04-16 15:59:00 -0600662 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800663
Chia-I Wu7732cb22015-03-26 15:27:55 +0800664 ret = desc_layout_init_bindings(layout, dev->desc_region, info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600665 if (ret != VK_SUCCESS) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800666 intel_desc_layout_destroy(layout);
667 return ret;
668 }
669
670 layout->obj.destroy = desc_layout_destroy;
671
672 *layout_ret = layout;
673
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600674 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800675}
676
677void intel_desc_layout_destroy(struct intel_desc_layout *layout)
678{
Chia-I Wu310eece2015-03-27 12:56:09 +0800679 uint32_t i;
680
681 for (i = 0; i < layout->binding_count; i++) {
682 struct intel_desc_layout_binding *binding = &layout->bindings[i];
683
684 if (binding->immutable_samplers)
685 intel_free(layout, binding->immutable_samplers);
686 }
Chia-I Wufc9d9132015-03-26 15:04:41 +0800687 intel_free(layout, layout->bindings);
Chia-I Wuf8385062015-01-04 16:27:24 +0800688 intel_base_destroy(&layout->obj.base);
689}
690
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500691static void pipeline_layout_destroy(struct intel_obj *obj)
Chia-I Wuf8385062015-01-04 16:27:24 +0800692{
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500693 struct intel_pipeline_layout *pipeline_layout =
694 intel_pipeline_layout_from_obj(obj);
Chia-I Wuf8385062015-01-04 16:27:24 +0800695
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500696 intel_pipeline_layout_destroy(pipeline_layout);
Chia-I Wuf8385062015-01-04 16:27:24 +0800697}
698
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500699VkResult intel_pipeline_layout_create(struct intel_dev *dev,
700 const VkPipelineLayoutCreateInfo *pPipelineCreateInfo,
701 struct intel_pipeline_layout **pipeline_layout_ret)
Chia-I Wuf8385062015-01-04 16:27:24 +0800702{
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500703 struct intel_pipeline_layout *pipeline_layout;
704 uint32_t count = pPipelineCreateInfo->descriptorSetCount;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800705 uint32_t i;
706
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500707 pipeline_layout = (struct intel_pipeline_layout *) intel_base_create(
708 &dev->base.handle, sizeof(*pipeline_layout), dev->base.dbg,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600709 VK_OBJECT_TYPE_PIPELINE_LAYOUT, NULL, 0);
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500710
711 if (!pipeline_layout)
Tony Barbour8205d902015-04-16 15:59:00 -0600712 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800713
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500714 pipeline_layout->layouts = intel_alloc(pipeline_layout,
715 sizeof(pipeline_layout->layouts[0]) * count,
716 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
717 if (!pipeline_layout->layouts) {
718 intel_pipeline_layout_destroy(pipeline_layout);
Tony Barbour8205d902015-04-16 15:59:00 -0600719 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800720 }
721
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500722 pipeline_layout->dynamic_desc_indices = intel_alloc(pipeline_layout,
723 sizeof(pipeline_layout->dynamic_desc_indices[0]) * count,
Tony Barbour8205d902015-04-16 15:59:00 -0600724 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500725 if (!pipeline_layout->dynamic_desc_indices) {
726 intel_pipeline_layout_destroy(pipeline_layout);
Tony Barbour8205d902015-04-16 15:59:00 -0600727 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wu862c5572015-03-28 15:23:55 +0800728 }
729
730 for (i = 0; i < count; i++) {
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500731 pipeline_layout->layouts[i] = intel_desc_layout(pPipelineCreateInfo->pSetLayouts[i]);
732 pipeline_layout->dynamic_desc_indices[i] = pipeline_layout->total_dynamic_desc_count;
Chia-I Wu862c5572015-03-28 15:23:55 +0800733
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500734 pipeline_layout->total_dynamic_desc_count +=
735 pipeline_layout->layouts[i]->dynamic_desc_count;
Chia-I Wu862c5572015-03-28 15:23:55 +0800736 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800737
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500738 pipeline_layout->layout_count = count;
Chia-I Wuf8385062015-01-04 16:27:24 +0800739
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500740 pipeline_layout->obj.destroy = pipeline_layout_destroy;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800741
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500742 *pipeline_layout_ret = pipeline_layout;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800743
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600744 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800745}
746
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500747void intel_pipeline_layout_destroy(struct intel_pipeline_layout *pipeline_layout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800748{
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500749 if (pipeline_layout->dynamic_desc_indices)
750 intel_free(pipeline_layout, pipeline_layout->dynamic_desc_indices);
751 if (pipeline_layout->layouts)
752 intel_free(pipeline_layout, pipeline_layout->layouts);
753 intel_base_destroy(&pipeline_layout->obj.base);
Chia-I Wuf8385062015-01-04 16:27:24 +0800754}
755
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600756ICD_EXPORT VkResult VKAPI vkCreateDescriptorSetLayout(
757 VkDevice device,
758 const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
759 VkDescriptorSetLayout* pSetLayout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800760{
761 struct intel_dev *dev = intel_dev(device);
Chia-I Wuf8385062015-01-04 16:27:24 +0800762
Chia-I Wu7732cb22015-03-26 15:27:55 +0800763 return intel_desc_layout_create(dev, pCreateInfo,
Chia-I Wuf8385062015-01-04 16:27:24 +0800764 (struct intel_desc_layout **) pSetLayout);
765}
766
Tony Barbourde4124d2015-07-03 10:33:54 -0600767ICD_EXPORT VkResult VKAPI vkDestroyDescriptorSetLayout(
768 VkDevice device,
769 VkDescriptorSetLayout descriptorSetLayout)
770
771{
772 struct intel_obj *obj = intel_obj(descriptorSetLayout.handle);
773
774 obj->destroy(obj);
775 return VK_SUCCESS;
776}
777
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500778ICD_EXPORT VkResult VKAPI vkCreatePipelineLayout(
779 VkDevice device,
780 const VkPipelineLayoutCreateInfo* pCreateInfo,
781 VkPipelineLayout* pPipelineLayout)
Chia-I Wu7732cb22015-03-26 15:27:55 +0800782{
783 struct intel_dev *dev = intel_dev(device);
784
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500785 return intel_pipeline_layout_create(dev,
786 pCreateInfo,
787 (struct intel_pipeline_layout **) pPipelineLayout);
Chia-I Wu7732cb22015-03-26 15:27:55 +0800788}
789
Tony Barbourde4124d2015-07-03 10:33:54 -0600790ICD_EXPORT VkResult VKAPI vkDestroyPipelineLayout(
791 VkDevice device,
792 VkPipelineLayout pipelineLayout)
793
794{
795 struct intel_obj *obj = intel_obj(pipelineLayout.handle);
796
797 obj->destroy(obj);
798 return VK_SUCCESS;
799}
800
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600801ICD_EXPORT VkResult VKAPI vkCreateDescriptorPool(
802 VkDevice device,
803 VkDescriptorPoolUsage poolUsage,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600804 uint32_t maxSets,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600805 const VkDescriptorPoolCreateInfo* pCreateInfo,
806 VkDescriptorPool* pDescriptorPool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800807{
808 struct intel_dev *dev = intel_dev(device);
809
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800810 return intel_desc_pool_create(dev, poolUsage, maxSets, pCreateInfo,
811 (struct intel_desc_pool **) pDescriptorPool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800812}
813
Tony Barbourde4124d2015-07-03 10:33:54 -0600814ICD_EXPORT VkResult VKAPI vkDestroyDescriptorPool(
815 VkDevice device,
816 VkDescriptorPool descriptorPool)
817
818{
819 struct intel_obj *obj = intel_obj(descriptorPool.handle);
820
821 obj->destroy(obj);
822 return VK_SUCCESS;
823}
824
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600825ICD_EXPORT VkResult VKAPI vkResetDescriptorPool(
Mike Stroyan230e6252015-04-17 12:36:38 -0600826 VkDevice device,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600827 VkDescriptorPool descriptorPool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800828{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800829 struct intel_desc_pool *pool = intel_desc_pool(descriptorPool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800830
Chia-I Wudee95612015-03-26 15:23:52 +0800831 intel_desc_pool_reset(pool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800832
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600833 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800834}
835
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600836ICD_EXPORT VkResult VKAPI vkAllocDescriptorSets(
Mike Stroyan230e6252015-04-17 12:36:38 -0600837 VkDevice device,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600838 VkDescriptorPool descriptorPool,
839 VkDescriptorSetUsage setUsage,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600840 uint32_t count,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600841 const VkDescriptorSetLayout* pSetLayouts,
Cody Northropc8aa4a52015-08-03 12:47:29 -0600842 VkDescriptorSet* pDescriptorSets)
Chia-I Wuf8385062015-01-04 16:27:24 +0800843{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800844 struct intel_desc_pool *pool = intel_desc_pool(descriptorPool);
845 struct intel_dev *dev = pool->dev;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600846 VkResult ret = VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800847 uint32_t i;
848
849 for (i = 0; i < count; i++) {
850 const struct intel_desc_layout *layout =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600851 intel_desc_layout((VkDescriptorSetLayout) pSetLayouts[i]);
Chia-I Wuf8385062015-01-04 16:27:24 +0800852
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800853 ret = intel_desc_set_create(dev, pool, setUsage, layout,
Chia-I Wuf8385062015-01-04 16:27:24 +0800854 (struct intel_desc_set **) &pDescriptorSets[i]);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600855 if (ret != VK_SUCCESS)
Chia-I Wuf8385062015-01-04 16:27:24 +0800856 break;
857 }
858
Chia-I Wuf8385062015-01-04 16:27:24 +0800859 return ret;
860}
861
Tony Barbourb857d312015-07-10 10:50:45 -0600862ICD_EXPORT VkResult VKAPI vkFreeDescriptorSets(
863 VkDevice device,
864 VkDescriptorPool descriptorPool,
865 uint32_t count,
866 const VkDescriptorSet* pDescriptorSets)
867{
868 uint32_t i;
869
870 for (i = 0; i < count; i++) {
871 intel_desc_set_destroy(
872 *(struct intel_desc_set **) &pDescriptorSets[i]);
873 }
874 return VK_SUCCESS;
875}
876
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800877ICD_EXPORT VkResult VKAPI vkUpdateDescriptorSets(
878 VkDevice device,
879 uint32_t writeCount,
880 const VkWriteDescriptorSet* pDescriptorWrites,
881 uint32_t copyCount,
882 const VkCopyDescriptorSet* pDescriptorCopies)
Chia-I Wuf8385062015-01-04 16:27:24 +0800883{
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800884 uint32_t i, j;
Chia-I Wuf8385062015-01-04 16:27:24 +0800885
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800886 for (i = 0; i < writeCount; i++) {
887 const VkWriteDescriptorSet *write = &pDescriptorWrites[i];
888 struct intel_desc_set *set = intel_desc_set(write->destSet);
889 const struct intel_desc_layout_binding *binding;
890 struct intel_desc_iter iter;
Chia-I Wuf8385062015-01-04 16:27:24 +0800891
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800892 if (!desc_iter_init_for_writing(&iter, set, write->destBinding,
893 write->destArrayElement) ||
894 iter.type != write->descriptorType)
895 return VK_ERROR_INVALID_VALUE;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800896
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800897 switch (write->descriptorType) {
898 case VK_DESCRIPTOR_TYPE_SAMPLER:
899 for (j = 0; j < write->count; j++) {
900 const VkDescriptorInfo *info = &write->pDescriptors[j];
901 const struct intel_sampler *sampler =
902 intel_sampler(info->sampler);
903
904 desc_set_write_sampler(set, &iter, sampler);
905
906 if (!intel_desc_iter_advance(&iter))
907 return VK_ERROR_INVALID_VALUE;
908 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800909 break;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800910 case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
911 binding = &set->layout->bindings[write->destBinding];
912
913 /* write the shared immutable sampler */
914 if (binding->shared_immutable_sampler) {
915 struct intel_desc_offset end;
916 struct intel_desc_sampler sampler_desc;
917
918 assert(!iter.increment.sampler);
919 intel_desc_offset_set(&end, iter.begin.surface,
920 iter.begin.sampler + set->region->sampler_desc_size);
921
922 sampler_desc.sampler = binding->shared_immutable_sampler;
923 intel_desc_region_update(set->region, &iter.begin, &end,
924 NULL, &sampler_desc);
925 }
926
927 for (j = 0; j < write->count; j++) {
928 const VkDescriptorInfo *info = &write->pDescriptors[j];
929 const struct intel_img_view *img_view =
930 intel_img_view(info->imageView);
931 const struct intel_sampler *sampler =
932 (binding->immutable_samplers) ?
933 binding->immutable_samplers[write->destArrayElement + j] :
934 intel_sampler(info->sampler);
935
936 desc_set_write_combined_image_sampler(set, &iter,
937 img_view, info->imageLayout, sampler);
938
939 if (!intel_desc_iter_advance(&iter))
940 return VK_ERROR_INVALID_VALUE;
941 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800942 break;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800943 case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
944 case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
945 for (j = 0; j < write->count; j++) {
946 const VkDescriptorInfo *info = &write->pDescriptors[j];
947 const struct intel_img_view *img_view =
948 intel_img_view(info->imageView);
949
950 desc_set_write_image(set, &iter, img_view, info->imageLayout);
951
952 if (!intel_desc_iter_advance(&iter))
953 return VK_ERROR_INVALID_VALUE;
954 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800955 break;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800956 case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
957 case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
958 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
959 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
960 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
961 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
962 for (j = 0; j < write->count; j++) {
963 const VkDescriptorInfo *info = &write->pDescriptors[j];
964 const struct intel_buf_view *buf_view =
965 intel_buf_view(info->bufferView);
966
967 desc_set_write_buffer(set, &iter, buf_view);
968
969 if (!intel_desc_iter_advance(&iter))
970 return VK_ERROR_INVALID_VALUE;
971 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800972 break;
973 default:
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800974 return VK_ERROR_INVALID_VALUE;
Chia-I Wuf8385062015-01-04 16:27:24 +0800975 break;
976 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800977 }
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800978
979 for (i = 0; i < copyCount; i++) {
980 const VkCopyDescriptorSet *copy = &pDescriptorCopies[i];
981 const struct intel_desc_set *src_set = intel_desc_set(copy->srcSet);
982 const struct intel_desc_set *dst_set = intel_desc_set(copy->destSet);
983 struct intel_desc_iter src_iter, dst_iter;
984 struct intel_desc_offset src_begin, dst_begin;
985
986 if (!desc_iter_init_for_writing(&src_iter, src_set,
987 copy->srcBinding, copy->srcArrayElement) ||
988 !desc_iter_init_for_writing(&dst_iter, dst_set,
989 copy->destBinding, copy->destArrayElement) ||
990 src_iter.type != dst_iter.type)
991 return VK_ERROR_INVALID_VALUE;
992
993 /* disallow combined image samplers */
994 if (dst_iter.type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
995 return VK_ERROR_UNKNOWN;
996
997 /* save the begin offsets */
998 src_begin = src_iter.begin;
999 dst_begin = dst_iter.begin;
1000
1001 /* advance to the end */
1002 for (j = 0; j < copy->count; j++) {
1003 if (!intel_desc_iter_advance(&src_iter) ||
1004 !intel_desc_iter_advance(&dst_iter))
1005 return VK_ERROR_INVALID_VALUE;
1006 }
1007
1008 intel_desc_region_copy(dst_set->region, &dst_begin,
1009 &dst_iter.end, &src_begin);
1010 }
1011
1012 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +08001013}