blob: a8d51fe027c557f86dd966800f535848db32b9af [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
83static bool desc_iter_init_for_update(struct intel_desc_iter *iter,
84 const struct intel_desc_set *set,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060085 VkDescriptorType type,
Chia-I Wu7732cb22015-03-26 15:27:55 +080086 uint32_t binding_index, uint32_t array_base)
87{
88 if (!intel_desc_iter_init_for_binding(iter, set->layout,
89 binding_index, array_base) || iter->type != type)
90 return false;
91
92 intel_desc_offset_add(&iter->begin, &iter->begin, &set->region_begin);
93 intel_desc_offset_add(&iter->end, &iter->end, &set->region_begin);
94
95 return true;
96}
97
98bool intel_desc_iter_advance(struct intel_desc_iter *iter)
99{
100 if (iter->cur >= iter->size)
101 return false;
102
103 iter->cur++;
104
105 iter->begin = iter->end;
106 intel_desc_offset_add(&iter->end, &iter->end, &iter->increment);
107
108 return true;
109}
110
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800111static bool desc_region_init_desc_sizes(struct intel_desc_region *region,
112 const struct intel_gpu *gpu)
Chia-I Wuf8385062015-01-04 16:27:24 +0800113{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800114 region->surface_desc_size = sizeof(struct intel_desc_surface);
115 region->sampler_desc_size = sizeof(struct intel_desc_sampler);
Chia-I Wuf8385062015-01-04 16:27:24 +0800116
117 return true;
118}
119
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600120VkResult intel_desc_region_create(struct intel_dev *dev,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800121 struct intel_desc_region **region_ret)
Chia-I Wuf8385062015-01-04 16:27:24 +0800122{
123 const uint32_t surface_count = 16384;
124 const uint32_t sampler_count = 16384;
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800125 struct intel_desc_region *region;
Chia-I Wuf8385062015-01-04 16:27:24 +0800126
Tony Barbour8205d902015-04-16 15:59:00 -0600127 region = intel_alloc(dev, sizeof(*region), 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800128 if (!region)
Tony Barbour8205d902015-04-16 15:59:00 -0600129 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800130
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800131 memset(region, 0, sizeof(*region));
Chia-I Wuf8385062015-01-04 16:27:24 +0800132
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800133 if (!desc_region_init_desc_sizes(region, dev->gpu)) {
134 intel_free(dev, region);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600135 return VK_ERROR_UNKNOWN;
Chia-I Wuf8385062015-01-04 16:27:24 +0800136 }
137
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800138 intel_desc_offset_set(&region->size,
139 region->surface_desc_size * surface_count,
140 region->sampler_desc_size * sampler_count);
Chia-I Wuf8385062015-01-04 16:27:24 +0800141
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800142 region->surfaces = intel_alloc(dev, region->size.surface,
Tony Barbour8205d902015-04-16 15:59:00 -0600143 64, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800144 if (!region->surfaces) {
145 intel_free(dev, region);
Tony Barbour8205d902015-04-16 15:59:00 -0600146 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800147 }
148
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800149 region->samplers = intel_alloc(dev, region->size.sampler,
Tony Barbour8205d902015-04-16 15:59:00 -0600150 64, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800151 if (!region->samplers) {
152 intel_free(dev, region->surfaces);
153 intel_free(dev, region);
Tony Barbour8205d902015-04-16 15:59:00 -0600154 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800155 }
156
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800157 *region_ret = region;
Chia-I Wuf8385062015-01-04 16:27:24 +0800158
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600159 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800160}
161
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800162void intel_desc_region_destroy(struct intel_dev *dev,
163 struct intel_desc_region *region)
Chia-I Wuf8385062015-01-04 16:27:24 +0800164{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800165 intel_free(dev, region->samplers);
166 intel_free(dev, region->surfaces);
167 intel_free(dev, region);
Chia-I Wuf8385062015-01-04 16:27:24 +0800168}
169
170/**
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800171 * Get the size of a descriptor in the region.
Chia-I Wuf8385062015-01-04 16:27:24 +0800172 */
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600173static VkResult desc_region_get_desc_size(const struct intel_desc_region *region,
174 VkDescriptorType type,
Chia-I Wuf8385062015-01-04 16:27:24 +0800175 struct intel_desc_offset *size)
176{
177 uint32_t surface_size = 0, sampler_size = 0;
178
179 switch (type) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600180 case VK_DESCRIPTOR_TYPE_SAMPLER:
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800181 sampler_size = region->sampler_desc_size;
Chia-I Wuf8385062015-01-04 16:27:24 +0800182 break;
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600183 case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800184 surface_size = region->surface_desc_size;
185 sampler_size = region->sampler_desc_size;
Chia-I Wuf8385062015-01-04 16:27:24 +0800186 break;
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600187 case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
188 case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
189 case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
190 case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600191 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600192 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600193 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600194 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800195 surface_size = region->surface_desc_size;
Chia-I Wuf8385062015-01-04 16:27:24 +0800196 break;
197 default:
198 assert(!"unknown descriptor type");
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600199 return VK_ERROR_INVALID_VALUE;
Chia-I Wuf8385062015-01-04 16:27:24 +0800200 break;
201 }
202
203 intel_desc_offset_set(size, surface_size, sampler_size);
204
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600205 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800206}
207
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600208VkResult intel_desc_region_alloc(struct intel_desc_region *region,
209 const VkDescriptorPoolCreateInfo *info,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800210 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
231 intel_desc_offset_set(&alloc, surface_size, sampler_size);
232
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800233 *begin = region->cur;
234 intel_desc_offset_add(end, &region->cur, &alloc);
Chia-I Wuf8385062015-01-04 16:27:24 +0800235
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800236 if (!intel_desc_offset_within(end, &region->size))
Tony Barbour8205d902015-04-16 15:59:00 -0600237 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800238
239 /* increment the writer pointer */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800240 region->cur = *end;
Chia-I Wuf8385062015-01-04 16:27:24 +0800241
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600242 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800243}
244
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800245static void desc_region_validate_begin_end(const struct intel_desc_region *region,
246 const struct intel_desc_offset *begin,
247 const struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800248{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800249 assert(begin->surface % region->surface_desc_size == 0 &&
250 begin->sampler % region->sampler_desc_size == 0);
251 assert(end->surface % region->surface_desc_size == 0 &&
252 end->sampler % region->sampler_desc_size == 0);
253 assert(intel_desc_offset_within(end, &region->size));
Chia-I Wuf8385062015-01-04 16:27:24 +0800254}
255
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800256void intel_desc_region_free(struct intel_desc_region *region,
257 const struct intel_desc_offset *begin,
258 const struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800259{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800260 desc_region_validate_begin_end(region, begin, end);
Chia-I Wuf8385062015-01-04 16:27:24 +0800261
262 /* is it ok not to reclaim? */
263}
264
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600265VkResult intel_desc_region_begin_update(struct intel_desc_region *region,
266 VkDescriptorUpdateMode mode)
Chia-I Wuf8385062015-01-04 16:27:24 +0800267{
268 /* no-op */
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600269 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800270}
271
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600272VkResult intel_desc_region_end_update(struct intel_desc_region *region,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800273 struct intel_cmd *cmd)
Chia-I Wuf8385062015-01-04 16:27:24 +0800274{
275 /* No pipelined update. cmd_draw() will do the work. */
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600276 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800277}
278
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800279void intel_desc_region_clear(struct intel_desc_region *region,
280 const struct intel_desc_offset *begin,
281 const struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800282{
283 uint32_t i;
284
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800285 desc_region_validate_begin_end(region, begin, end);
Chia-I Wuf8385062015-01-04 16:27:24 +0800286
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800287 for (i = begin->surface; i < end->surface; i += region->surface_desc_size) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800288 struct intel_desc_surface *desc = (struct intel_desc_surface *)
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800289 ((char *) region->surfaces + i);
Chia-I Wuf8385062015-01-04 16:27:24 +0800290
291 desc->mem = NULL;
292 desc->type = INTEL_DESC_SURFACE_UNUSED;
293 desc->u.unused = NULL;
294 }
295
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800296 for (i = begin->sampler; i < end->sampler; i += region->sampler_desc_size) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800297 struct intel_desc_sampler *desc = (struct intel_desc_sampler *)
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800298 ((char *) region->samplers + i);
Chia-I Wuf8385062015-01-04 16:27:24 +0800299
300 desc->sampler = NULL;
301 }
302}
303
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800304void intel_desc_region_update(struct intel_desc_region *region,
305 const struct intel_desc_offset *begin,
306 const struct intel_desc_offset *end,
307 const struct intel_desc_surface *surfaces,
308 const struct intel_desc_sampler *samplers)
Chia-I Wuf8385062015-01-04 16:27:24 +0800309{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800310 desc_region_validate_begin_end(region, begin, end);
Chia-I Wuf8385062015-01-04 16:27:24 +0800311
312 if (begin->surface < end->surface) {
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800313 memcpy((char *) region->surfaces + begin->surface, surfaces,
Chia-I Wuf8385062015-01-04 16:27:24 +0800314 end->surface - begin->surface);
315 }
316
317 if (begin->sampler < end->sampler) {
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800318 memcpy((char *) region->samplers + begin->sampler, samplers,
Chia-I Wuf8385062015-01-04 16:27:24 +0800319 end->sampler - begin->sampler);
320 }
321}
322
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800323void intel_desc_region_copy(struct intel_desc_region *region,
324 const struct intel_desc_offset *begin,
325 const struct intel_desc_offset *end,
326 const struct intel_desc_offset *src)
Chia-I Wuf8385062015-01-04 16:27:24 +0800327{
328 struct intel_desc_offset src_end;
329 const struct intel_desc_surface *surfaces;
330 const struct intel_desc_sampler *samplers;
331
332 /* no overlap */
333 assert(intel_desc_offset_within(src, begin) ||
334 intel_desc_offset_within(end, src));
335
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800336 /* no read past region */
Chia-I Wuf8385062015-01-04 16:27:24 +0800337 intel_desc_offset_sub(&src_end, end, begin);
338 intel_desc_offset_add(&src_end, src, &src_end);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800339 assert(intel_desc_offset_within(&src_end, &region->size));
Chia-I Wuf8385062015-01-04 16:27:24 +0800340
341 surfaces = (const struct intel_desc_surface *)
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800342 ((const char *) region->surfaces + src->surface);
Tony Barbour379e0a72015-02-05 11:09:34 -0700343 samplers = (const struct intel_desc_sampler *)
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800344 ((const char *) region->samplers + src->sampler);
Chia-I Wuf8385062015-01-04 16:27:24 +0800345
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800346 intel_desc_region_update(region, begin, end, surfaces, samplers);
Chia-I Wuf8385062015-01-04 16:27:24 +0800347}
348
Chia-I Wu862c5572015-03-28 15:23:55 +0800349void intel_desc_region_read_surface(const struct intel_desc_region *region,
350 const struct intel_desc_offset *offset,
Tony Barbour8205d902015-04-16 15:59:00 -0600351 VkShaderStage stage,
Chia-I Wu862c5572015-03-28 15:23:55 +0800352 const struct intel_mem **mem,
353 bool *read_only,
354 const uint32_t **cmd,
355 uint32_t *cmd_len)
356{
357 const struct intel_desc_surface *desc;
358 struct intel_desc_offset end;
359
360 intel_desc_offset_set(&end,
361 offset->surface + region->surface_desc_size, offset->sampler);
362 desc_region_validate_begin_end(region, offset, &end);
363
364 desc = (const struct intel_desc_surface *)
365 ((const char *) region->surfaces + offset->surface);
366
367 *mem = desc->mem;
368 *read_only = desc->read_only;
369 switch (desc->type) {
370 case INTEL_DESC_SURFACE_BUF:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600371 *cmd = (stage == VK_SHADER_STAGE_FRAGMENT) ?
Chia-I Wu862c5572015-03-28 15:23:55 +0800372 desc->u.buf->fs_cmd : desc->u.buf->cmd;
373 *cmd_len = desc->u.buf->cmd_len;
374 break;
375 case INTEL_DESC_SURFACE_IMG:
376 *cmd = desc->u.img->cmd;
377 *cmd_len = desc->u.img->cmd_len;
378 break;
379 case INTEL_DESC_SURFACE_UNUSED:
380 default:
381 *cmd = NULL;
382 *cmd_len = 0;
383 break;
384 }
385}
386
387void intel_desc_region_read_sampler(const struct intel_desc_region *region,
388 const struct intel_desc_offset *offset,
389 const struct intel_sampler **sampler)
390{
391 const struct intel_desc_sampler *desc;
392 struct intel_desc_offset end;
393
394 intel_desc_offset_set(&end,
395 offset->surface, offset->sampler + region->sampler_desc_size);
396 desc_region_validate_begin_end(region, offset, &end);
397
398 desc = (const struct intel_desc_sampler *)
399 ((const char *) region->samplers + offset->sampler);
400
401 *sampler = desc->sampler;
402}
403
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800404static void desc_pool_destroy(struct intel_obj *obj)
Chia-I Wuf8385062015-01-04 16:27:24 +0800405{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800406 struct intel_desc_pool *pool = intel_desc_pool_from_obj(obj);
Chia-I Wuf8385062015-01-04 16:27:24 +0800407
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800408 intel_desc_pool_destroy(pool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800409}
410
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600411VkResult intel_desc_pool_create(struct intel_dev *dev,
412 VkDescriptorPoolUsage usage,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800413 uint32_t max_sets,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600414 const VkDescriptorPoolCreateInfo *info,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800415 struct intel_desc_pool **pool_ret)
Chia-I Wuf8385062015-01-04 16:27:24 +0800416{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800417 struct intel_desc_pool *pool;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600418 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800419
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800420 pool = (struct intel_desc_pool *) intel_base_create(&dev->base.handle,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600421 sizeof(*pool), dev->base.dbg, VK_DBG_OBJECT_DESCRIPTOR_POOL,
Chia-I Wu545c2e12015-02-22 13:19:54 +0800422 info, 0);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800423 if (!pool)
Tony Barbour8205d902015-04-16 15:59:00 -0600424 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800425
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800426 pool->dev = dev;
Chia-I Wuf8385062015-01-04 16:27:24 +0800427
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800428 ret = intel_desc_region_alloc(dev->desc_region, info,
429 &pool->region_begin, &pool->region_end);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600430 if (ret != VK_SUCCESS) {
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800431 intel_base_destroy(&pool->obj.base);
Chia-I Wuf8385062015-01-04 16:27:24 +0800432 return ret;
433 }
434
435 /* point 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
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800438 pool->obj.destroy = desc_pool_destroy;
Chia-I Wuf8385062015-01-04 16:27:24 +0800439
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800440 *pool_ret = pool;
Chia-I Wuf8385062015-01-04 16:27:24 +0800441
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600442 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800443}
444
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800445void intel_desc_pool_destroy(struct intel_desc_pool *pool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800446{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800447 intel_desc_region_free(pool->dev->desc_region,
448 &pool->region_begin, &pool->region_end);
449 intel_base_destroy(&pool->obj.base);
Chia-I Wuf8385062015-01-04 16:27:24 +0800450}
451
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600452VkResult intel_desc_pool_alloc(struct intel_desc_pool *pool,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800453 const struct intel_desc_layout *layout,
454 struct intel_desc_offset *begin,
455 struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800456{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800457 *begin = pool->cur;
458 intel_desc_offset_add(end, &pool->cur, &layout->region_size);
Chia-I Wuf8385062015-01-04 16:27:24 +0800459
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800460 if (!intel_desc_offset_within(end, &pool->region_end))
Tony Barbour8205d902015-04-16 15:59:00 -0600461 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800462
463 /* increment the writer pointer */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800464 pool->cur = *end;
Chia-I Wuf8385062015-01-04 16:27:24 +0800465
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600466 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800467}
468
Chia-I Wudee95612015-03-26 15:23:52 +0800469void intel_desc_pool_reset(struct intel_desc_pool *pool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800470{
471 /* reset to head */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800472 pool->cur = pool->region_begin;
Chia-I Wuf8385062015-01-04 16:27:24 +0800473}
474
475static void desc_set_destroy(struct intel_obj *obj)
476{
477 struct intel_desc_set *set = intel_desc_set_from_obj(obj);
478
479 intel_desc_set_destroy(set);
480}
481
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600482VkResult intel_desc_set_create(struct intel_dev *dev,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800483 struct intel_desc_pool *pool,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600484 VkDescriptorSetUsage usage,
Chia-I Wuf8385062015-01-04 16:27:24 +0800485 const struct intel_desc_layout *layout,
486 struct intel_desc_set **set_ret)
487{
488 struct intel_desc_set *set;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600489 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800490
Chia-I Wu545c2e12015-02-22 13:19:54 +0800491 set = (struct intel_desc_set *) intel_base_create(&dev->base.handle,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600492 sizeof(*set), dev->base.dbg, VK_DBG_OBJECT_DESCRIPTOR_SET,
Chia-I Wu545c2e12015-02-22 13:19:54 +0800493 NULL, 0);
Chia-I Wuf8385062015-01-04 16:27:24 +0800494 if (!set)
Tony Barbour8205d902015-04-16 15:59:00 -0600495 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800496
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800497 set->region = dev->desc_region;
498 ret = intel_desc_pool_alloc(pool, layout,
499 &set->region_begin, &set->region_end);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600500 if (ret != VK_SUCCESS) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800501 intel_base_destroy(&set->obj.base);
502 return ret;
503 }
504
505 set->layout = layout;
506
507 set->obj.destroy = desc_set_destroy;
508
509 *set_ret = set;
510
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600511 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800512}
513
514void intel_desc_set_destroy(struct intel_desc_set *set)
515{
516 intel_base_destroy(&set->obj.base);
517}
518
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600519static bool desc_set_img_layout_read_only(VkImageLayout layout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800520{
521 switch (layout) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600522 case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
523 case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
524 case VK_IMAGE_LAYOUT_TRANSFER_SOURCE_OPTIMAL:
Chia-I Wuf8385062015-01-04 16:27:24 +0800525 return true;
526 default:
527 return false;
528 }
529}
530
531void intel_desc_set_update_samplers(struct intel_desc_set *set,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600532 const VkUpdateSamplers *update)
Chia-I Wuf8385062015-01-04 16:27:24 +0800533{
Chia-I Wu7732cb22015-03-26 15:27:55 +0800534 struct intel_desc_iter iter;
Chia-I Wuf8385062015-01-04 16:27:24 +0800535 uint32_t i;
536
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600537 if (!desc_iter_init_for_update(&iter, set, VK_DESCRIPTOR_TYPE_SAMPLER,
Chia-I Wu7732cb22015-03-26 15:27:55 +0800538 update->binding, update->arrayIndex))
Chia-I Wuf8385062015-01-04 16:27:24 +0800539 return;
540
541 for (i = 0; i < update->count; i++) {
542 const struct intel_sampler *sampler =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600543 intel_sampler((VkSampler) update->pSamplers[i]);
Chia-I Wuf8385062015-01-04 16:27:24 +0800544 struct intel_desc_sampler desc;
545
Chia-I Wuf8385062015-01-04 16:27:24 +0800546 desc.sampler = sampler;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800547 intel_desc_region_update(set->region, &iter.begin, &iter.end,
548 NULL, &desc);
Chia-I Wuf8385062015-01-04 16:27:24 +0800549
Chia-I Wu7732cb22015-03-26 15:27:55 +0800550 if (!intel_desc_iter_advance(&iter))
Chia-I Wuf8385062015-01-04 16:27:24 +0800551 break;
552 }
553}
554
555void intel_desc_set_update_sampler_textures(struct intel_desc_set *set,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600556 const VkUpdateSamplerTextures *update)
Chia-I Wuf8385062015-01-04 16:27:24 +0800557{
Chia-I Wu7732cb22015-03-26 15:27:55 +0800558 struct intel_desc_iter iter;
559 const struct intel_desc_layout_binding *binding;
Chia-I Wuf8385062015-01-04 16:27:24 +0800560 uint32_t i;
561
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600562 if (!desc_iter_init_for_update(&iter, set, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
Chia-I Wu7732cb22015-03-26 15:27:55 +0800563 update->binding, update->arrayIndex))
Chia-I Wuf8385062015-01-04 16:27:24 +0800564 return;
565
Chia-I Wu7732cb22015-03-26 15:27:55 +0800566 binding = &set->layout->bindings[update->binding];
567
Chia-I Wu310eece2015-03-27 12:56:09 +0800568 if (binding->shared_immutable_sampler) {
Chia-I Wu7732cb22015-03-26 15:27:55 +0800569 struct intel_desc_offset end;
570 struct intel_desc_sampler sampler_desc;
571
572 assert(!iter.increment.sampler);
573 intel_desc_offset_set(&end, iter.begin.surface,
574 iter.begin.sampler + set->region->sampler_desc_size);
575
Chia-I Wu310eece2015-03-27 12:56:09 +0800576 sampler_desc.sampler = binding->shared_immutable_sampler;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800577 intel_desc_region_update(set->region, &iter.begin, &end,
578 NULL, &sampler_desc);
579 }
580
Chia-I Wuf8385062015-01-04 16:27:24 +0800581 for (i = 0; i < update->count; i++) {
Chia-I Wu310eece2015-03-27 12:56:09 +0800582 const struct intel_sampler *sampler = (binding->immutable_samplers) ?
583 binding->immutable_samplers[update->arrayIndex + i] :
Courtney Goeltzenleuchterd38dcc92015-04-09 11:43:10 -0600584 intel_sampler(update->pSamplerImageViews[i].sampler);
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600585 const VkImageViewAttachInfo *info =
Chia-I Wuf8385062015-01-04 16:27:24 +0800586 update->pSamplerImageViews[i].pImageView;
587 const struct intel_img_view *view = intel_img_view(info->view);
588 struct intel_desc_surface view_desc;
589 struct intel_desc_sampler sampler_desc;
590
Chia-I Wuf8385062015-01-04 16:27:24 +0800591 view_desc.mem = view->img->obj.mem;
592 view_desc.read_only = desc_set_img_layout_read_only(info->layout);
593 view_desc.type = INTEL_DESC_SURFACE_IMG;
594 view_desc.u.img = view;
595
596 sampler_desc.sampler = sampler;
597
Chia-I Wu7732cb22015-03-26 15:27:55 +0800598 intel_desc_region_update(set->region, &iter.begin, &iter.end,
599 &view_desc, &sampler_desc);
Chia-I Wuf8385062015-01-04 16:27:24 +0800600
Chia-I Wu7732cb22015-03-26 15:27:55 +0800601 if (!intel_desc_iter_advance(&iter))
Chia-I Wuf8385062015-01-04 16:27:24 +0800602 break;
603 }
604}
605
606void intel_desc_set_update_images(struct intel_desc_set *set,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600607 const VkUpdateImages *update)
Chia-I Wuf8385062015-01-04 16:27:24 +0800608{
Chia-I Wu7732cb22015-03-26 15:27:55 +0800609 struct intel_desc_iter iter;
Chia-I Wuf8385062015-01-04 16:27:24 +0800610 uint32_t i;
611
Chia-I Wu7732cb22015-03-26 15:27:55 +0800612 if (!desc_iter_init_for_update(&iter, set, update->descriptorType,
613 update->binding, update->arrayIndex))
Chia-I Wuf8385062015-01-04 16:27:24 +0800614 return;
615
616 for (i = 0; i < update->count; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600617 const VkImageViewAttachInfo *info = &update->pImageViews[i];
Chia-I Wuf8385062015-01-04 16:27:24 +0800618 const struct intel_img_view *view = intel_img_view(info->view);
619 struct intel_desc_surface desc;
620
Chia-I Wuf8385062015-01-04 16:27:24 +0800621 desc.mem = view->img->obj.mem;
622 desc.read_only = desc_set_img_layout_read_only(info->layout);
623 desc.type = INTEL_DESC_SURFACE_IMG;
624 desc.u.img = view;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800625 intel_desc_region_update(set->region, &iter.begin, &iter.end,
626 &desc, NULL);
Chia-I Wuf8385062015-01-04 16:27:24 +0800627
Chia-I Wu7732cb22015-03-26 15:27:55 +0800628 if (!intel_desc_iter_advance(&iter))
Chia-I Wuf8385062015-01-04 16:27:24 +0800629 break;
630 }
631}
632
633void intel_desc_set_update_buffers(struct intel_desc_set *set,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600634 const VkUpdateBuffers *update)
Chia-I Wuf8385062015-01-04 16:27:24 +0800635{
Chia-I Wu7732cb22015-03-26 15:27:55 +0800636 struct intel_desc_iter iter;
Chia-I Wuf8385062015-01-04 16:27:24 +0800637 uint32_t i;
638
Chia-I Wu7732cb22015-03-26 15:27:55 +0800639 if (!desc_iter_init_for_update(&iter, set, update->descriptorType,
640 update->binding, update->arrayIndex))
Chia-I Wuf8385062015-01-04 16:27:24 +0800641 return;
642
643 for (i = 0; i < update->count; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600644 const VkBufferViewAttachInfo *info = &update->pBufferViews[i];
Chia-I Wuf8385062015-01-04 16:27:24 +0800645 const struct intel_buf_view *view = intel_buf_view(info->view);
646 struct intel_desc_surface desc;
647
Chia-I Wuf8385062015-01-04 16:27:24 +0800648 desc.mem = view->buf->obj.mem;
649 desc.read_only = false;
650 desc.type = INTEL_DESC_SURFACE_BUF;
651 desc.u.buf = view;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800652 intel_desc_region_update(set->region, &iter.begin, &iter.end,
653 &desc, NULL);
Chia-I Wuf8385062015-01-04 16:27:24 +0800654
Chia-I Wu7732cb22015-03-26 15:27:55 +0800655 if (!intel_desc_iter_advance(&iter))
Chia-I Wuf8385062015-01-04 16:27:24 +0800656 break;
657 }
658}
659
660void intel_desc_set_update_as_copy(struct intel_desc_set *set,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600661 const VkUpdateAsCopy *update)
Chia-I Wuf8385062015-01-04 16:27:24 +0800662{
663 const struct intel_desc_set *src_set =
664 intel_desc_set(update->descriptorSet);
Chia-I Wu7732cb22015-03-26 15:27:55 +0800665 struct intel_desc_iter iter, src_iter;
666 struct intel_desc_offset begin, src_begin;
Chia-I Wuf8385062015-01-04 16:27:24 +0800667 uint32_t i;
668
669 /* disallow combined sampler textures */
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600670 if (update->descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
Chia-I Wuf8385062015-01-04 16:27:24 +0800671 return;
672
Chia-I Wu7732cb22015-03-26 15:27:55 +0800673 if (!desc_iter_init_for_update(&iter, set, update->descriptorType,
674 update->binding, update->arrayElement) ||
675 !desc_iter_init_for_update(&src_iter, src_set, update->descriptorType,
676 update->binding, update->arrayElement))
Chia-I Wuf8385062015-01-04 16:27:24 +0800677 return;
678
Chia-I Wu7732cb22015-03-26 15:27:55 +0800679 /* save the begin offsets */
680 begin = iter.begin;
681 src_begin = src_iter.begin;
Chia-I Wuf8385062015-01-04 16:27:24 +0800682
Chia-I Wu7732cb22015-03-26 15:27:55 +0800683 /* advance to the end */
Chia-I Wuf8385062015-01-04 16:27:24 +0800684 for (i = 0; i < update->count; i++) {
Chia-I Wu7732cb22015-03-26 15:27:55 +0800685 if (!intel_desc_iter_advance(&iter) ||
686 !intel_desc_iter_advance(&src_iter)) {
687 /* out of bound */
688 return;
689 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800690 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800691
Chia-I Wu7732cb22015-03-26 15:27:55 +0800692 intel_desc_region_copy(set->region, &begin, &iter.end, &src_begin);
Chia-I Wuf8385062015-01-04 16:27:24 +0800693}
694
695static void desc_layout_destroy(struct intel_obj *obj)
696{
697 struct intel_desc_layout *layout = intel_desc_layout_from_obj(obj);
698
699 intel_desc_layout_destroy(layout);
700}
701
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600702static VkResult desc_layout_init_bindings(struct intel_desc_layout *layout,
Chia-I Wufc9d9132015-03-26 15:04:41 +0800703 const struct intel_desc_region *region,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600704 const VkDescriptorSetLayoutCreateInfo *info)
Chia-I Wuf8385062015-01-04 16:27:24 +0800705{
706 struct intel_desc_offset offset;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800707 uint32_t i;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600708 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800709
Chia-I Wu7732cb22015-03-26 15:27:55 +0800710 intel_desc_offset_set(&offset, 0, 0);
Chia-I Wuf8385062015-01-04 16:27:24 +0800711
Chia-I Wufc9d9132015-03-26 15:04:41 +0800712 /* allocate bindings */
713 layout->bindings = intel_alloc(layout, sizeof(layout->bindings[0]) *
Tony Barbour8205d902015-04-16 15:59:00 -0600714 info->count, 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wufc9d9132015-03-26 15:04:41 +0800715 if (!layout->bindings)
Tony Barbour8205d902015-04-16 15:59:00 -0600716 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wufc9d9132015-03-26 15:04:41 +0800717
718 memset(layout->bindings, 0, sizeof(layout->bindings[0]) * info->count);
719 layout->binding_count = info->count;
720
721 /* initialize bindings */
722 for (i = 0; i < info->count; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600723 const VkDescriptorSetLayoutBinding *lb = &info->pBinding[i];
Chia-I Wufc9d9132015-03-26 15:04:41 +0800724 struct intel_desc_layout_binding *binding = &layout->bindings[i];
Chia-I Wuf8385062015-01-04 16:27:24 +0800725 struct intel_desc_offset size;
726
Chia-I Wufc9d9132015-03-26 15:04:41 +0800727 switch (lb->descriptorType) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600728 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600729 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
Chia-I Wufc9d9132015-03-26 15:04:41 +0800730 layout->dynamic_desc_count += lb->count;
731 break;
732 default:
733 break;
734 }
735
Chia-I Wu7732cb22015-03-26 15:27:55 +0800736 /* lb->stageFlags does not gain us anything */
737 binding->type = lb->descriptorType;
738 binding->array_size = lb->count;
739 binding->offset = offset;
740
Chia-I Wufc9d9132015-03-26 15:04:41 +0800741 ret = desc_region_get_desc_size(region,
742 lb->descriptorType, &size);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600743 if (ret != VK_SUCCESS)
Chia-I Wuf8385062015-01-04 16:27:24 +0800744 return ret;
745
Chia-I Wu310eece2015-03-27 12:56:09 +0800746 binding->increment = size;
747
748 /* copy immutable samplers */
749 if (lb->pImmutableSamplers) {
750 bool shared = true;
751 uint32_t j;
752
753 for (j = 1; j < lb->count; j++) {
754 if (lb->pImmutableSamplers[j] != lb->pImmutableSamplers[0]) {
755 shared = false;
756 break;
757 }
758 }
759
760 if (shared) {
761 binding->shared_immutable_sampler =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600762 intel_sampler((VkSampler) lb->pImmutableSamplers[0]);
Chia-I Wu310eece2015-03-27 12:56:09 +0800763 /* set sampler offset increment to 0 */
764 intel_desc_offset_set(&binding->increment,
765 binding->increment.surface, 0);
766 } else {
767 binding->immutable_samplers = intel_alloc(layout,
768 sizeof(binding->immutable_samplers[0]) * lb->count,
Tony Barbour8205d902015-04-16 15:59:00 -0600769 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu310eece2015-03-27 12:56:09 +0800770 if (!binding->immutable_samplers)
Tony Barbour8205d902015-04-16 15:59:00 -0600771 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wu310eece2015-03-27 12:56:09 +0800772
773 for (j = 0; j < lb->count; j++) {
774 binding->immutable_samplers[j] =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600775 intel_sampler((VkSampler) lb->pImmutableSamplers[j]);
Chia-I Wu310eece2015-03-27 12:56:09 +0800776 }
777 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800778 }
779
Chia-I Wu7732cb22015-03-26 15:27:55 +0800780 /* increment offset */
Chia-I Wufc9d9132015-03-26 15:04:41 +0800781 intel_desc_offset_mad(&size, &binding->increment, &size,
782 lb->count - 1);
Chia-I Wuf8385062015-01-04 16:27:24 +0800783 intel_desc_offset_add(&offset, &offset, &size);
Chia-I Wuf8385062015-01-04 16:27:24 +0800784 }
785
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800786 layout->region_size = offset;
Chia-I Wuf8385062015-01-04 16:27:24 +0800787
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600788 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800789}
790
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600791VkResult intel_desc_layout_create(struct intel_dev *dev,
792 const VkDescriptorSetLayoutCreateInfo *info,
Chia-I Wuf8385062015-01-04 16:27:24 +0800793 struct intel_desc_layout **layout_ret)
794{
795 struct intel_desc_layout *layout;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600796 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800797
Chia-I Wu545c2e12015-02-22 13:19:54 +0800798 layout = (struct intel_desc_layout *) intel_base_create(&dev->base.handle,
799 sizeof(*layout), dev->base.dbg,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600800 VK_DBG_OBJECT_DESCRIPTOR_SET_LAYOUT, info, 0);
Chia-I Wuf8385062015-01-04 16:27:24 +0800801 if (!layout)
Tony Barbour8205d902015-04-16 15:59:00 -0600802 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800803
Chia-I Wu7732cb22015-03-26 15:27:55 +0800804 ret = desc_layout_init_bindings(layout, dev->desc_region, info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600805 if (ret != VK_SUCCESS) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800806 intel_desc_layout_destroy(layout);
807 return ret;
808 }
809
810 layout->obj.destroy = desc_layout_destroy;
811
812 *layout_ret = layout;
813
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600814 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800815}
816
817void intel_desc_layout_destroy(struct intel_desc_layout *layout)
818{
Chia-I Wu310eece2015-03-27 12:56:09 +0800819 uint32_t i;
820
821 for (i = 0; i < layout->binding_count; i++) {
822 struct intel_desc_layout_binding *binding = &layout->bindings[i];
823
824 if (binding->immutable_samplers)
825 intel_free(layout, binding->immutable_samplers);
826 }
Chia-I Wufc9d9132015-03-26 15:04:41 +0800827 intel_free(layout, layout->bindings);
Chia-I Wuf8385062015-01-04 16:27:24 +0800828 intel_base_destroy(&layout->obj.base);
829}
830
Chia-I Wu7732cb22015-03-26 15:27:55 +0800831static void desc_layout_chain_destroy(struct intel_obj *obj)
Chia-I Wuf8385062015-01-04 16:27:24 +0800832{
Chia-I Wu7732cb22015-03-26 15:27:55 +0800833 struct intel_desc_layout_chain *chain =
834 intel_desc_layout_chain_from_obj(obj);
Chia-I Wuf8385062015-01-04 16:27:24 +0800835
Chia-I Wu7732cb22015-03-26 15:27:55 +0800836 intel_desc_layout_chain_destroy(chain);
Chia-I Wuf8385062015-01-04 16:27:24 +0800837}
838
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600839VkResult intel_desc_layout_chain_create(struct intel_dev *dev,
840 const VkDescriptorSetLayout *layouts,
Chia-I Wu7732cb22015-03-26 15:27:55 +0800841 uint32_t count,
842 struct intel_desc_layout_chain **chain_ret)
Chia-I Wuf8385062015-01-04 16:27:24 +0800843{
Chia-I Wu7732cb22015-03-26 15:27:55 +0800844 struct intel_desc_layout_chain *chain;
845 uint32_t i;
846
847 chain = (struct intel_desc_layout_chain *)
848 intel_base_create(&dev->base.handle, sizeof(*chain), dev->base.dbg,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600849 VK_DBG_OBJECT_DESCRIPTOR_SET_LAYOUT_CHAIN, NULL, 0);
Chia-I Wu7732cb22015-03-26 15:27:55 +0800850 if (!chain)
Tony Barbour8205d902015-04-16 15:59:00 -0600851 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800852
853 chain->layouts = intel_alloc(chain, sizeof(chain->layouts[0]) * count,
Tony Barbour8205d902015-04-16 15:59:00 -0600854 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu7732cb22015-03-26 15:27:55 +0800855 if (!chain) {
856 intel_desc_layout_chain_destroy(chain);
Tony Barbour8205d902015-04-16 15:59:00 -0600857 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800858 }
859
Chia-I Wu862c5572015-03-28 15:23:55 +0800860 chain->dynamic_desc_indices = intel_alloc(chain,
861 sizeof(chain->dynamic_desc_indices[0]) * count,
Tony Barbour8205d902015-04-16 15:59:00 -0600862 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu862c5572015-03-28 15:23:55 +0800863 if (!chain->dynamic_desc_indices) {
864 intel_desc_layout_chain_destroy(chain);
Tony Barbour8205d902015-04-16 15:59:00 -0600865 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wu862c5572015-03-28 15:23:55 +0800866 }
867
868 for (i = 0; i < count; i++) {
Chia-I Wu7732cb22015-03-26 15:27:55 +0800869 chain->layouts[i] = intel_desc_layout(layouts[i]);
Chia-I Wu862c5572015-03-28 15:23:55 +0800870 chain->dynamic_desc_indices[i] = chain->total_dynamic_desc_count;
871
872 chain->total_dynamic_desc_count +=
873 chain->layouts[i]->dynamic_desc_count;
874 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800875
Chia-I Wu7732cb22015-03-26 15:27:55 +0800876 chain->layout_count = count;
Chia-I Wuf8385062015-01-04 16:27:24 +0800877
Chia-I Wu7732cb22015-03-26 15:27:55 +0800878 chain->obj.destroy = desc_layout_chain_destroy;
879
880 *chain_ret = chain;
881
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600882 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800883}
884
Chia-I Wu7732cb22015-03-26 15:27:55 +0800885void intel_desc_layout_chain_destroy(struct intel_desc_layout_chain *chain)
Chia-I Wuf8385062015-01-04 16:27:24 +0800886{
Chia-I Wu862c5572015-03-28 15:23:55 +0800887 if (chain->dynamic_desc_indices)
888 intel_free(chain, chain->dynamic_desc_indices);
Chia-I Wu7732cb22015-03-26 15:27:55 +0800889 if (chain->layouts)
890 intel_free(chain, chain->layouts);
891 intel_base_destroy(&chain->obj.base);
Chia-I Wuf8385062015-01-04 16:27:24 +0800892}
893
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600894ICD_EXPORT VkResult VKAPI vkCreateDescriptorSetLayout(
895 VkDevice device,
896 const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
897 VkDescriptorSetLayout* pSetLayout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800898{
899 struct intel_dev *dev = intel_dev(device);
Chia-I Wuf8385062015-01-04 16:27:24 +0800900
Chia-I Wu7732cb22015-03-26 15:27:55 +0800901 return intel_desc_layout_create(dev, pCreateInfo,
Chia-I Wuf8385062015-01-04 16:27:24 +0800902 (struct intel_desc_layout **) pSetLayout);
903}
904
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600905ICD_EXPORT VkResult VKAPI vkCreateDescriptorSetLayoutChain(
906 VkDevice device,
Chia-I Wu7732cb22015-03-26 15:27:55 +0800907 uint32_t setLayoutArrayCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600908 const VkDescriptorSetLayout* pSetLayoutArray,
909 VkDescriptorSetLayoutChain* pLayoutChain)
Chia-I Wu7732cb22015-03-26 15:27:55 +0800910{
911 struct intel_dev *dev = intel_dev(device);
912
913 return intel_desc_layout_chain_create(dev,
914 pSetLayoutArray, setLayoutArrayCount,
915 (struct intel_desc_layout_chain **) pLayoutChain);
916}
917
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600918ICD_EXPORT VkResult VKAPI vkBeginDescriptorPoolUpdate(
919 VkDevice device,
920 VkDescriptorUpdateMode updateMode)
Chia-I Wuf8385062015-01-04 16:27:24 +0800921{
922 struct intel_dev *dev = intel_dev(device);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800923 struct intel_desc_region *region = dev->desc_region;
Chia-I Wuf8385062015-01-04 16:27:24 +0800924
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800925 return intel_desc_region_begin_update(region, updateMode);
Chia-I Wuf8385062015-01-04 16:27:24 +0800926}
927
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600928ICD_EXPORT VkResult VKAPI vkEndDescriptorPoolUpdate(
929 VkDevice device,
930 VkCmdBuffer cmd_)
Chia-I Wuf8385062015-01-04 16:27:24 +0800931{
932 struct intel_dev *dev = intel_dev(device);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800933 struct intel_desc_region *region = dev->desc_region;
Chia-I Wuf8385062015-01-04 16:27:24 +0800934 struct intel_cmd *cmd = intel_cmd(cmd_);
935
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800936 return intel_desc_region_end_update(region, cmd);
Chia-I Wuf8385062015-01-04 16:27:24 +0800937}
938
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600939ICD_EXPORT VkResult VKAPI vkCreateDescriptorPool(
940 VkDevice device,
941 VkDescriptorPoolUsage poolUsage,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600942 uint32_t maxSets,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600943 const VkDescriptorPoolCreateInfo* pCreateInfo,
944 VkDescriptorPool* pDescriptorPool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800945{
946 struct intel_dev *dev = intel_dev(device);
947
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800948 return intel_desc_pool_create(dev, poolUsage, maxSets, pCreateInfo,
949 (struct intel_desc_pool **) pDescriptorPool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800950}
951
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600952ICD_EXPORT VkResult VKAPI vkResetDescriptorPool(
953 VkDescriptorPool descriptorPool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800954{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800955 struct intel_desc_pool *pool = intel_desc_pool(descriptorPool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800956
Chia-I Wudee95612015-03-26 15:23:52 +0800957 intel_desc_pool_reset(pool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800958
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600959 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800960}
961
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600962ICD_EXPORT VkResult VKAPI vkAllocDescriptorSets(
963 VkDescriptorPool descriptorPool,
964 VkDescriptorSetUsage setUsage,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600965 uint32_t count,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600966 const VkDescriptorSetLayout* pSetLayouts,
967 VkDescriptorSet* pDescriptorSets,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600968 uint32_t* pCount)
Chia-I Wuf8385062015-01-04 16:27:24 +0800969{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800970 struct intel_desc_pool *pool = intel_desc_pool(descriptorPool);
971 struct intel_dev *dev = pool->dev;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600972 VkResult ret = VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800973 uint32_t i;
974
975 for (i = 0; i < count; i++) {
976 const struct intel_desc_layout *layout =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600977 intel_desc_layout((VkDescriptorSetLayout) pSetLayouts[i]);
Chia-I Wuf8385062015-01-04 16:27:24 +0800978
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800979 ret = intel_desc_set_create(dev, pool, setUsage, layout,
Chia-I Wuf8385062015-01-04 16:27:24 +0800980 (struct intel_desc_set **) &pDescriptorSets[i]);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600981 if (ret != VK_SUCCESS)
Chia-I Wuf8385062015-01-04 16:27:24 +0800982 break;
983 }
984
985 if (pCount)
986 *pCount = i;
987
988 return ret;
989}
990
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600991ICD_EXPORT void VKAPI vkClearDescriptorSets(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600992 VkDescriptorPool descriptorPool,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600993 uint32_t count,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600994 const VkDescriptorSet* pDescriptorSets)
Chia-I Wuf8385062015-01-04 16:27:24 +0800995{
996 uint32_t i;
997
998 for (i = 0; i < count; i++) {
999 struct intel_desc_set *set =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001000 intel_desc_set((VkDescriptorSet) pDescriptorSets[i]);
Chia-I Wuf8385062015-01-04 16:27:24 +08001001
Chia-I Wu8d24b3b2015-03-26 13:14:16 +08001002 intel_desc_region_clear(set->region, &set->region_begin, &set->region_end);
Chia-I Wuf8385062015-01-04 16:27:24 +08001003 }
1004}
1005
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001006ICD_EXPORT void VKAPI vkUpdateDescriptors(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001007 VkDescriptorSet descriptorSet,
Chia-I Wu7732cb22015-03-26 15:27:55 +08001008 uint32_t updateCount,
1009 const void** ppUpdateArray)
Chia-I Wuf8385062015-01-04 16:27:24 +08001010{
1011 struct intel_desc_set *set = intel_desc_set(descriptorSet);
Chia-I Wu7732cb22015-03-26 15:27:55 +08001012 uint32_t i;
Chia-I Wuf8385062015-01-04 16:27:24 +08001013
Chia-I Wu7732cb22015-03-26 15:27:55 +08001014 for (i = 0; i < updateCount; i++) {
1015 const union {
1016 struct {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001017 VkStructureType sType;
Chia-I Wu7732cb22015-03-26 15:27:55 +08001018 const void* pNext;
1019 } common;
Chia-I Wuf8385062015-01-04 16:27:24 +08001020
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001021 VkUpdateSamplers samplers;
1022 VkUpdateSamplerTextures sampler_textures;
1023 VkUpdateImages images;
1024 VkUpdateBuffers buffers;
1025 VkUpdateAsCopy as_copy;
Chia-I Wu7732cb22015-03-26 15:27:55 +08001026 } *u = ppUpdateArray[i];
1027
Chia-I Wuf8385062015-01-04 16:27:24 +08001028 switch (u->common.sType) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001029 case VK_STRUCTURE_TYPE_UPDATE_SAMPLERS:
Chia-I Wuf8385062015-01-04 16:27:24 +08001030 intel_desc_set_update_samplers(set, &u->samplers);
1031 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001032 case VK_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
Chia-I Wuf8385062015-01-04 16:27:24 +08001033 intel_desc_set_update_sampler_textures(set, &u->sampler_textures);
1034 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001035 case VK_STRUCTURE_TYPE_UPDATE_IMAGES:
Chia-I Wuf8385062015-01-04 16:27:24 +08001036 intel_desc_set_update_images(set, &u->images);
1037 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001038 case VK_STRUCTURE_TYPE_UPDATE_BUFFERS:
Chia-I Wuf8385062015-01-04 16:27:24 +08001039 intel_desc_set_update_buffers(set, &u->buffers);
1040 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001041 case VK_STRUCTURE_TYPE_UPDATE_AS_COPY:
Chia-I Wuf8385062015-01-04 16:27:24 +08001042 intel_desc_set_update_as_copy(set, &u->as_copy);
1043 break;
1044 default:
1045 assert(!"unknown descriptor update");
1046 break;
1047 }
Chia-I Wuf8385062015-01-04 16:27:24 +08001048 }
1049}