blob: 8d4ded6c657036b2772178d00e20700716c9bd44 [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
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800265void intel_desc_region_clear(struct intel_desc_region *region,
266 const struct intel_desc_offset *begin,
267 const struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800268{
269 uint32_t i;
270
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800271 desc_region_validate_begin_end(region, begin, end);
Chia-I Wuf8385062015-01-04 16:27:24 +0800272
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800273 for (i = begin->surface; i < end->surface; i += region->surface_desc_size) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800274 struct intel_desc_surface *desc = (struct intel_desc_surface *)
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800275 ((char *) region->surfaces + i);
Chia-I Wuf8385062015-01-04 16:27:24 +0800276
277 desc->mem = NULL;
278 desc->type = INTEL_DESC_SURFACE_UNUSED;
279 desc->u.unused = NULL;
280 }
281
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800282 for (i = begin->sampler; i < end->sampler; i += region->sampler_desc_size) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800283 struct intel_desc_sampler *desc = (struct intel_desc_sampler *)
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800284 ((char *) region->samplers + i);
Chia-I Wuf8385062015-01-04 16:27:24 +0800285
286 desc->sampler = NULL;
287 }
288}
289
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800290void intel_desc_region_update(struct intel_desc_region *region,
291 const struct intel_desc_offset *begin,
292 const struct intel_desc_offset *end,
293 const struct intel_desc_surface *surfaces,
294 const struct intel_desc_sampler *samplers)
Chia-I Wuf8385062015-01-04 16:27:24 +0800295{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800296 desc_region_validate_begin_end(region, begin, end);
Chia-I Wuf8385062015-01-04 16:27:24 +0800297
298 if (begin->surface < end->surface) {
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800299 memcpy((char *) region->surfaces + begin->surface, surfaces,
Chia-I Wuf8385062015-01-04 16:27:24 +0800300 end->surface - begin->surface);
301 }
302
303 if (begin->sampler < end->sampler) {
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800304 memcpy((char *) region->samplers + begin->sampler, samplers,
Chia-I Wuf8385062015-01-04 16:27:24 +0800305 end->sampler - begin->sampler);
306 }
307}
308
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800309void intel_desc_region_copy(struct intel_desc_region *region,
310 const struct intel_desc_offset *begin,
311 const struct intel_desc_offset *end,
312 const struct intel_desc_offset *src)
Chia-I Wuf8385062015-01-04 16:27:24 +0800313{
314 struct intel_desc_offset src_end;
315 const struct intel_desc_surface *surfaces;
316 const struct intel_desc_sampler *samplers;
317
318 /* no overlap */
319 assert(intel_desc_offset_within(src, begin) ||
320 intel_desc_offset_within(end, src));
321
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800322 /* no read past region */
Chia-I Wuf8385062015-01-04 16:27:24 +0800323 intel_desc_offset_sub(&src_end, end, begin);
324 intel_desc_offset_add(&src_end, src, &src_end);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800325 assert(intel_desc_offset_within(&src_end, &region->size));
Chia-I Wuf8385062015-01-04 16:27:24 +0800326
327 surfaces = (const struct intel_desc_surface *)
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800328 ((const char *) region->surfaces + src->surface);
Tony Barbour379e0a72015-02-05 11:09:34 -0700329 samplers = (const struct intel_desc_sampler *)
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800330 ((const char *) region->samplers + src->sampler);
Chia-I Wuf8385062015-01-04 16:27:24 +0800331
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800332 intel_desc_region_update(region, begin, end, surfaces, samplers);
Chia-I Wuf8385062015-01-04 16:27:24 +0800333}
334
Chia-I Wu862c5572015-03-28 15:23:55 +0800335void intel_desc_region_read_surface(const struct intel_desc_region *region,
336 const struct intel_desc_offset *offset,
Tony Barbour8205d902015-04-16 15:59:00 -0600337 VkShaderStage stage,
Chia-I Wu862c5572015-03-28 15:23:55 +0800338 const struct intel_mem **mem,
339 bool *read_only,
340 const uint32_t **cmd,
341 uint32_t *cmd_len)
342{
343 const struct intel_desc_surface *desc;
344 struct intel_desc_offset end;
345
346 intel_desc_offset_set(&end,
347 offset->surface + region->surface_desc_size, offset->sampler);
348 desc_region_validate_begin_end(region, offset, &end);
349
350 desc = (const struct intel_desc_surface *)
351 ((const char *) region->surfaces + offset->surface);
352
353 *mem = desc->mem;
354 *read_only = desc->read_only;
355 switch (desc->type) {
356 case INTEL_DESC_SURFACE_BUF:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600357 *cmd = (stage == VK_SHADER_STAGE_FRAGMENT) ?
Chia-I Wu862c5572015-03-28 15:23:55 +0800358 desc->u.buf->fs_cmd : desc->u.buf->cmd;
359 *cmd_len = desc->u.buf->cmd_len;
360 break;
361 case INTEL_DESC_SURFACE_IMG:
362 *cmd = desc->u.img->cmd;
363 *cmd_len = desc->u.img->cmd_len;
364 break;
365 case INTEL_DESC_SURFACE_UNUSED:
366 default:
367 *cmd = NULL;
368 *cmd_len = 0;
369 break;
370 }
371}
372
373void intel_desc_region_read_sampler(const struct intel_desc_region *region,
374 const struct intel_desc_offset *offset,
375 const struct intel_sampler **sampler)
376{
377 const struct intel_desc_sampler *desc;
378 struct intel_desc_offset end;
379
380 intel_desc_offset_set(&end,
381 offset->surface, offset->sampler + region->sampler_desc_size);
382 desc_region_validate_begin_end(region, offset, &end);
383
384 desc = (const struct intel_desc_sampler *)
385 ((const char *) region->samplers + offset->sampler);
386
387 *sampler = desc->sampler;
388}
389
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800390static void desc_pool_destroy(struct intel_obj *obj)
Chia-I Wuf8385062015-01-04 16:27:24 +0800391{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800392 struct intel_desc_pool *pool = intel_desc_pool_from_obj(obj);
Chia-I Wuf8385062015-01-04 16:27:24 +0800393
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800394 intel_desc_pool_destroy(pool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800395}
396
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600397VkResult intel_desc_pool_create(struct intel_dev *dev,
398 VkDescriptorPoolUsage usage,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800399 uint32_t max_sets,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600400 const VkDescriptorPoolCreateInfo *info,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800401 struct intel_desc_pool **pool_ret)
Chia-I Wuf8385062015-01-04 16:27:24 +0800402{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800403 struct intel_desc_pool *pool;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600404 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800405
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800406 pool = (struct intel_desc_pool *) intel_base_create(&dev->base.handle,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600407 sizeof(*pool), dev->base.dbg, VK_DBG_OBJECT_DESCRIPTOR_POOL,
Chia-I Wu545c2e12015-02-22 13:19:54 +0800408 info, 0);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800409 if (!pool)
Tony Barbour8205d902015-04-16 15:59:00 -0600410 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800411
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800412 pool->dev = dev;
Chia-I Wuf8385062015-01-04 16:27:24 +0800413
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800414 ret = intel_desc_region_alloc(dev->desc_region, info,
415 &pool->region_begin, &pool->region_end);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600416 if (ret != VK_SUCCESS) {
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800417 intel_base_destroy(&pool->obj.base);
Chia-I Wuf8385062015-01-04 16:27:24 +0800418 return ret;
419 }
420
421 /* point to head */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800422 pool->cur = pool->region_begin;
Chia-I Wuf8385062015-01-04 16:27:24 +0800423
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800424 pool->obj.destroy = desc_pool_destroy;
Chia-I Wuf8385062015-01-04 16:27:24 +0800425
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800426 *pool_ret = pool;
Chia-I Wuf8385062015-01-04 16:27:24 +0800427
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600428 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800429}
430
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800431void intel_desc_pool_destroy(struct intel_desc_pool *pool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800432{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800433 intel_desc_region_free(pool->dev->desc_region,
434 &pool->region_begin, &pool->region_end);
435 intel_base_destroy(&pool->obj.base);
Chia-I Wuf8385062015-01-04 16:27:24 +0800436}
437
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600438VkResult intel_desc_pool_alloc(struct intel_desc_pool *pool,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800439 const struct intel_desc_layout *layout,
440 struct intel_desc_offset *begin,
441 struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800442{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800443 *begin = pool->cur;
444 intel_desc_offset_add(end, &pool->cur, &layout->region_size);
Chia-I Wuf8385062015-01-04 16:27:24 +0800445
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800446 if (!intel_desc_offset_within(end, &pool->region_end))
Tony Barbour8205d902015-04-16 15:59:00 -0600447 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800448
449 /* increment the writer pointer */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800450 pool->cur = *end;
Chia-I Wuf8385062015-01-04 16:27:24 +0800451
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600452 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800453}
454
Chia-I Wudee95612015-03-26 15:23:52 +0800455void intel_desc_pool_reset(struct intel_desc_pool *pool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800456{
457 /* reset to head */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800458 pool->cur = pool->region_begin;
Chia-I Wuf8385062015-01-04 16:27:24 +0800459}
460
461static void desc_set_destroy(struct intel_obj *obj)
462{
463 struct intel_desc_set *set = intel_desc_set_from_obj(obj);
464
465 intel_desc_set_destroy(set);
466}
467
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600468VkResult intel_desc_set_create(struct intel_dev *dev,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800469 struct intel_desc_pool *pool,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600470 VkDescriptorSetUsage usage,
Chia-I Wuf8385062015-01-04 16:27:24 +0800471 const struct intel_desc_layout *layout,
472 struct intel_desc_set **set_ret)
473{
474 struct intel_desc_set *set;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600475 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800476
Chia-I Wu545c2e12015-02-22 13:19:54 +0800477 set = (struct intel_desc_set *) intel_base_create(&dev->base.handle,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600478 sizeof(*set), dev->base.dbg, VK_DBG_OBJECT_DESCRIPTOR_SET,
Chia-I Wu545c2e12015-02-22 13:19:54 +0800479 NULL, 0);
Chia-I Wuf8385062015-01-04 16:27:24 +0800480 if (!set)
Tony Barbour8205d902015-04-16 15:59:00 -0600481 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800482
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800483 set->region = dev->desc_region;
484 ret = intel_desc_pool_alloc(pool, layout,
485 &set->region_begin, &set->region_end);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600486 if (ret != VK_SUCCESS) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800487 intel_base_destroy(&set->obj.base);
488 return ret;
489 }
490
491 set->layout = layout;
492
493 set->obj.destroy = desc_set_destroy;
494
495 *set_ret = set;
496
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600497 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800498}
499
500void intel_desc_set_destroy(struct intel_desc_set *set)
501{
502 intel_base_destroy(&set->obj.base);
503}
504
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600505static bool desc_set_img_layout_read_only(VkImageLayout layout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800506{
507 switch (layout) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600508 case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
509 case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
510 case VK_IMAGE_LAYOUT_TRANSFER_SOURCE_OPTIMAL:
Chia-I Wuf8385062015-01-04 16:27:24 +0800511 return true;
512 default:
513 return false;
514 }
515}
516
517void intel_desc_set_update_samplers(struct intel_desc_set *set,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600518 const VkUpdateSamplers *update)
Chia-I Wuf8385062015-01-04 16:27:24 +0800519{
Chia-I Wu7732cb22015-03-26 15:27:55 +0800520 struct intel_desc_iter iter;
Chia-I Wuf8385062015-01-04 16:27:24 +0800521 uint32_t i;
522
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600523 if (!desc_iter_init_for_update(&iter, set, VK_DESCRIPTOR_TYPE_SAMPLER,
Chia-I Wu7732cb22015-03-26 15:27:55 +0800524 update->binding, update->arrayIndex))
Chia-I Wuf8385062015-01-04 16:27:24 +0800525 return;
526
527 for (i = 0; i < update->count; i++) {
528 const struct intel_sampler *sampler =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600529 intel_sampler((VkSampler) update->pSamplers[i]);
Chia-I Wuf8385062015-01-04 16:27:24 +0800530 struct intel_desc_sampler desc;
531
Chia-I Wuf8385062015-01-04 16:27:24 +0800532 desc.sampler = sampler;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800533 intel_desc_region_update(set->region, &iter.begin, &iter.end,
534 NULL, &desc);
Chia-I Wuf8385062015-01-04 16:27:24 +0800535
Chia-I Wu7732cb22015-03-26 15:27:55 +0800536 if (!intel_desc_iter_advance(&iter))
Chia-I Wuf8385062015-01-04 16:27:24 +0800537 break;
538 }
539}
540
541void intel_desc_set_update_sampler_textures(struct intel_desc_set *set,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600542 const VkUpdateSamplerTextures *update)
Chia-I Wuf8385062015-01-04 16:27:24 +0800543{
Chia-I Wu7732cb22015-03-26 15:27:55 +0800544 struct intel_desc_iter iter;
545 const struct intel_desc_layout_binding *binding;
Chia-I Wuf8385062015-01-04 16:27:24 +0800546 uint32_t i;
547
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600548 if (!desc_iter_init_for_update(&iter, set, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
Chia-I Wu7732cb22015-03-26 15:27:55 +0800549 update->binding, update->arrayIndex))
Chia-I Wuf8385062015-01-04 16:27:24 +0800550 return;
551
Chia-I Wu7732cb22015-03-26 15:27:55 +0800552 binding = &set->layout->bindings[update->binding];
553
Chia-I Wu310eece2015-03-27 12:56:09 +0800554 if (binding->shared_immutable_sampler) {
Chia-I Wu7732cb22015-03-26 15:27:55 +0800555 struct intel_desc_offset end;
556 struct intel_desc_sampler sampler_desc;
557
558 assert(!iter.increment.sampler);
559 intel_desc_offset_set(&end, iter.begin.surface,
560 iter.begin.sampler + set->region->sampler_desc_size);
561
Chia-I Wu310eece2015-03-27 12:56:09 +0800562 sampler_desc.sampler = binding->shared_immutable_sampler;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800563 intel_desc_region_update(set->region, &iter.begin, &end,
564 NULL, &sampler_desc);
565 }
566
Chia-I Wuf8385062015-01-04 16:27:24 +0800567 for (i = 0; i < update->count; i++) {
Chia-I Wu310eece2015-03-27 12:56:09 +0800568 const struct intel_sampler *sampler = (binding->immutable_samplers) ?
569 binding->immutable_samplers[update->arrayIndex + i] :
Courtney Goeltzenleuchterd38dcc92015-04-09 11:43:10 -0600570 intel_sampler(update->pSamplerImageViews[i].sampler);
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600571 const VkImageViewAttachInfo *info =
Chia-I Wuf8385062015-01-04 16:27:24 +0800572 update->pSamplerImageViews[i].pImageView;
573 const struct intel_img_view *view = intel_img_view(info->view);
574 struct intel_desc_surface view_desc;
575 struct intel_desc_sampler sampler_desc;
576
Chia-I Wuf8385062015-01-04 16:27:24 +0800577 view_desc.mem = view->img->obj.mem;
578 view_desc.read_only = desc_set_img_layout_read_only(info->layout);
579 view_desc.type = INTEL_DESC_SURFACE_IMG;
580 view_desc.u.img = view;
581
582 sampler_desc.sampler = sampler;
583
Chia-I Wu7732cb22015-03-26 15:27:55 +0800584 intel_desc_region_update(set->region, &iter.begin, &iter.end,
585 &view_desc, &sampler_desc);
Chia-I Wuf8385062015-01-04 16:27:24 +0800586
Chia-I Wu7732cb22015-03-26 15:27:55 +0800587 if (!intel_desc_iter_advance(&iter))
Chia-I Wuf8385062015-01-04 16:27:24 +0800588 break;
589 }
590}
591
592void intel_desc_set_update_images(struct intel_desc_set *set,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600593 const VkUpdateImages *update)
Chia-I Wuf8385062015-01-04 16:27:24 +0800594{
Chia-I Wu7732cb22015-03-26 15:27:55 +0800595 struct intel_desc_iter iter;
Chia-I Wuf8385062015-01-04 16:27:24 +0800596 uint32_t i;
597
Chia-I Wu7732cb22015-03-26 15:27:55 +0800598 if (!desc_iter_init_for_update(&iter, set, update->descriptorType,
599 update->binding, update->arrayIndex))
Chia-I Wuf8385062015-01-04 16:27:24 +0800600 return;
601
602 for (i = 0; i < update->count; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600603 const VkImageViewAttachInfo *info = &update->pImageViews[i];
Chia-I Wuf8385062015-01-04 16:27:24 +0800604 const struct intel_img_view *view = intel_img_view(info->view);
605 struct intel_desc_surface desc;
606
Chia-I Wuf8385062015-01-04 16:27:24 +0800607 desc.mem = view->img->obj.mem;
608 desc.read_only = desc_set_img_layout_read_only(info->layout);
609 desc.type = INTEL_DESC_SURFACE_IMG;
610 desc.u.img = view;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800611 intel_desc_region_update(set->region, &iter.begin, &iter.end,
612 &desc, NULL);
Chia-I Wuf8385062015-01-04 16:27:24 +0800613
Chia-I Wu7732cb22015-03-26 15:27:55 +0800614 if (!intel_desc_iter_advance(&iter))
Chia-I Wuf8385062015-01-04 16:27:24 +0800615 break;
616 }
617}
618
619void intel_desc_set_update_buffers(struct intel_desc_set *set,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600620 const VkUpdateBuffers *update)
Chia-I Wuf8385062015-01-04 16:27:24 +0800621{
Chia-I Wu7732cb22015-03-26 15:27:55 +0800622 struct intel_desc_iter iter;
Chia-I Wuf8385062015-01-04 16:27:24 +0800623 uint32_t i;
624
Chia-I Wu7732cb22015-03-26 15:27:55 +0800625 if (!desc_iter_init_for_update(&iter, set, update->descriptorType,
626 update->binding, update->arrayIndex))
Chia-I Wuf8385062015-01-04 16:27:24 +0800627 return;
628
629 for (i = 0; i < update->count; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600630 const VkBufferViewAttachInfo *info = &update->pBufferViews[i];
Chia-I Wuf8385062015-01-04 16:27:24 +0800631 const struct intel_buf_view *view = intel_buf_view(info->view);
632 struct intel_desc_surface desc;
633
Chia-I Wuf8385062015-01-04 16:27:24 +0800634 desc.mem = view->buf->obj.mem;
635 desc.read_only = false;
636 desc.type = INTEL_DESC_SURFACE_BUF;
637 desc.u.buf = view;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800638 intel_desc_region_update(set->region, &iter.begin, &iter.end,
639 &desc, NULL);
Chia-I Wuf8385062015-01-04 16:27:24 +0800640
Chia-I Wu7732cb22015-03-26 15:27:55 +0800641 if (!intel_desc_iter_advance(&iter))
Chia-I Wuf8385062015-01-04 16:27:24 +0800642 break;
643 }
644}
645
646void intel_desc_set_update_as_copy(struct intel_desc_set *set,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600647 const VkUpdateAsCopy *update)
Chia-I Wuf8385062015-01-04 16:27:24 +0800648{
649 const struct intel_desc_set *src_set =
650 intel_desc_set(update->descriptorSet);
Chia-I Wu7732cb22015-03-26 15:27:55 +0800651 struct intel_desc_iter iter, src_iter;
652 struct intel_desc_offset begin, src_begin;
Chia-I Wuf8385062015-01-04 16:27:24 +0800653 uint32_t i;
654
655 /* disallow combined sampler textures */
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600656 if (update->descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
Chia-I Wuf8385062015-01-04 16:27:24 +0800657 return;
658
Chia-I Wu7732cb22015-03-26 15:27:55 +0800659 if (!desc_iter_init_for_update(&iter, set, update->descriptorType,
660 update->binding, update->arrayElement) ||
661 !desc_iter_init_for_update(&src_iter, src_set, update->descriptorType,
662 update->binding, update->arrayElement))
Chia-I Wuf8385062015-01-04 16:27:24 +0800663 return;
664
Chia-I Wu7732cb22015-03-26 15:27:55 +0800665 /* save the begin offsets */
666 begin = iter.begin;
667 src_begin = src_iter.begin;
Chia-I Wuf8385062015-01-04 16:27:24 +0800668
Chia-I Wu7732cb22015-03-26 15:27:55 +0800669 /* advance to the end */
Chia-I Wuf8385062015-01-04 16:27:24 +0800670 for (i = 0; i < update->count; i++) {
Chia-I Wu7732cb22015-03-26 15:27:55 +0800671 if (!intel_desc_iter_advance(&iter) ||
672 !intel_desc_iter_advance(&src_iter)) {
673 /* out of bound */
674 return;
675 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800676 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800677
Chia-I Wu7732cb22015-03-26 15:27:55 +0800678 intel_desc_region_copy(set->region, &begin, &iter.end, &src_begin);
Chia-I Wuf8385062015-01-04 16:27:24 +0800679}
680
681static void desc_layout_destroy(struct intel_obj *obj)
682{
683 struct intel_desc_layout *layout = intel_desc_layout_from_obj(obj);
684
685 intel_desc_layout_destroy(layout);
686}
687
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600688static VkResult desc_layout_init_bindings(struct intel_desc_layout *layout,
Chia-I Wufc9d9132015-03-26 15:04:41 +0800689 const struct intel_desc_region *region,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600690 const VkDescriptorSetLayoutCreateInfo *info)
Chia-I Wuf8385062015-01-04 16:27:24 +0800691{
692 struct intel_desc_offset offset;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800693 uint32_t i;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600694 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800695
Chia-I Wu7732cb22015-03-26 15:27:55 +0800696 intel_desc_offset_set(&offset, 0, 0);
Chia-I Wuf8385062015-01-04 16:27:24 +0800697
Chia-I Wufc9d9132015-03-26 15:04:41 +0800698 /* allocate bindings */
699 layout->bindings = intel_alloc(layout, sizeof(layout->bindings[0]) *
Tony Barbour8205d902015-04-16 15:59:00 -0600700 info->count, 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wufc9d9132015-03-26 15:04:41 +0800701 if (!layout->bindings)
Tony Barbour8205d902015-04-16 15:59:00 -0600702 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wufc9d9132015-03-26 15:04:41 +0800703
704 memset(layout->bindings, 0, sizeof(layout->bindings[0]) * info->count);
705 layout->binding_count = info->count;
706
707 /* initialize bindings */
708 for (i = 0; i < info->count; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600709 const VkDescriptorSetLayoutBinding *lb = &info->pBinding[i];
Chia-I Wufc9d9132015-03-26 15:04:41 +0800710 struct intel_desc_layout_binding *binding = &layout->bindings[i];
Chia-I Wuf8385062015-01-04 16:27:24 +0800711 struct intel_desc_offset size;
712
Chia-I Wufc9d9132015-03-26 15:04:41 +0800713 switch (lb->descriptorType) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600714 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600715 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
Chia-I Wud3114a22015-05-25 16:22:52 +0800716 layout->dynamic_desc_count += lb->arraySize;
Chia-I Wufc9d9132015-03-26 15:04:41 +0800717 break;
718 default:
719 break;
720 }
721
Chia-I Wu7732cb22015-03-26 15:27:55 +0800722 /* lb->stageFlags does not gain us anything */
723 binding->type = lb->descriptorType;
Chia-I Wud3114a22015-05-25 16:22:52 +0800724 binding->array_size = lb->arraySize;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800725 binding->offset = offset;
726
Chia-I Wufc9d9132015-03-26 15:04:41 +0800727 ret = desc_region_get_desc_size(region,
728 lb->descriptorType, &size);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600729 if (ret != VK_SUCCESS)
Chia-I Wuf8385062015-01-04 16:27:24 +0800730 return ret;
731
Chia-I Wu310eece2015-03-27 12:56:09 +0800732 binding->increment = size;
733
734 /* copy immutable samplers */
735 if (lb->pImmutableSamplers) {
736 bool shared = true;
737 uint32_t j;
738
Chia-I Wud3114a22015-05-25 16:22:52 +0800739 for (j = 1; j < lb->arraySize; j++) {
Chia-I Wu310eece2015-03-27 12:56:09 +0800740 if (lb->pImmutableSamplers[j] != lb->pImmutableSamplers[0]) {
741 shared = false;
742 break;
743 }
744 }
745
746 if (shared) {
747 binding->shared_immutable_sampler =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600748 intel_sampler((VkSampler) lb->pImmutableSamplers[0]);
Chia-I Wu310eece2015-03-27 12:56:09 +0800749 /* set sampler offset increment to 0 */
750 intel_desc_offset_set(&binding->increment,
751 binding->increment.surface, 0);
752 } else {
753 binding->immutable_samplers = intel_alloc(layout,
Chia-I Wud3114a22015-05-25 16:22:52 +0800754 sizeof(binding->immutable_samplers[0]) * lb->arraySize,
Tony Barbour8205d902015-04-16 15:59:00 -0600755 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu310eece2015-03-27 12:56:09 +0800756 if (!binding->immutable_samplers)
Tony Barbour8205d902015-04-16 15:59:00 -0600757 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wu310eece2015-03-27 12:56:09 +0800758
Chia-I Wud3114a22015-05-25 16:22:52 +0800759 for (j = 0; j < lb->arraySize; j++) {
Chia-I Wu310eece2015-03-27 12:56:09 +0800760 binding->immutable_samplers[j] =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600761 intel_sampler((VkSampler) lb->pImmutableSamplers[j]);
Chia-I Wu310eece2015-03-27 12:56:09 +0800762 }
763 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800764 }
765
Chia-I Wu7732cb22015-03-26 15:27:55 +0800766 /* increment offset */
Chia-I Wufc9d9132015-03-26 15:04:41 +0800767 intel_desc_offset_mad(&size, &binding->increment, &size,
Chia-I Wud3114a22015-05-25 16:22:52 +0800768 lb->arraySize - 1);
Chia-I Wuf8385062015-01-04 16:27:24 +0800769 intel_desc_offset_add(&offset, &offset, &size);
Chia-I Wuf8385062015-01-04 16:27:24 +0800770 }
771
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800772 layout->region_size = offset;
Chia-I Wuf8385062015-01-04 16:27:24 +0800773
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600774 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800775}
776
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600777VkResult intel_desc_layout_create(struct intel_dev *dev,
778 const VkDescriptorSetLayoutCreateInfo *info,
Chia-I Wuf8385062015-01-04 16:27:24 +0800779 struct intel_desc_layout **layout_ret)
780{
781 struct intel_desc_layout *layout;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600782 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800783
Chia-I Wu545c2e12015-02-22 13:19:54 +0800784 layout = (struct intel_desc_layout *) intel_base_create(&dev->base.handle,
785 sizeof(*layout), dev->base.dbg,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600786 VK_DBG_OBJECT_DESCRIPTOR_SET_LAYOUT, info, 0);
Chia-I Wuf8385062015-01-04 16:27:24 +0800787 if (!layout)
Tony Barbour8205d902015-04-16 15:59:00 -0600788 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800789
Chia-I Wu7732cb22015-03-26 15:27:55 +0800790 ret = desc_layout_init_bindings(layout, dev->desc_region, info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600791 if (ret != VK_SUCCESS) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800792 intel_desc_layout_destroy(layout);
793 return ret;
794 }
795
796 layout->obj.destroy = desc_layout_destroy;
797
798 *layout_ret = layout;
799
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600800 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800801}
802
803void intel_desc_layout_destroy(struct intel_desc_layout *layout)
804{
Chia-I Wu310eece2015-03-27 12:56:09 +0800805 uint32_t i;
806
807 for (i = 0; i < layout->binding_count; i++) {
808 struct intel_desc_layout_binding *binding = &layout->bindings[i];
809
810 if (binding->immutable_samplers)
811 intel_free(layout, binding->immutable_samplers);
812 }
Chia-I Wufc9d9132015-03-26 15:04:41 +0800813 intel_free(layout, layout->bindings);
Chia-I Wuf8385062015-01-04 16:27:24 +0800814 intel_base_destroy(&layout->obj.base);
815}
816
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500817static void pipeline_layout_destroy(struct intel_obj *obj)
Chia-I Wuf8385062015-01-04 16:27:24 +0800818{
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500819 struct intel_pipeline_layout *pipeline_layout =
820 intel_pipeline_layout_from_obj(obj);
Chia-I Wuf8385062015-01-04 16:27:24 +0800821
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500822 intel_pipeline_layout_destroy(pipeline_layout);
Chia-I Wuf8385062015-01-04 16:27:24 +0800823}
824
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500825VkResult intel_pipeline_layout_create(struct intel_dev *dev,
826 const VkPipelineLayoutCreateInfo *pPipelineCreateInfo,
827 struct intel_pipeline_layout **pipeline_layout_ret)
Chia-I Wuf8385062015-01-04 16:27:24 +0800828{
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500829 struct intel_pipeline_layout *pipeline_layout;
830 uint32_t count = pPipelineCreateInfo->descriptorSetCount;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800831 uint32_t i;
832
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500833 pipeline_layout = (struct intel_pipeline_layout *) intel_base_create(
834 &dev->base.handle, sizeof(*pipeline_layout), dev->base.dbg,
835 VK_DBG_OBJECT_PIPELINE_LAYOUT, NULL, 0);
836
837 if (!pipeline_layout)
Tony Barbour8205d902015-04-16 15:59:00 -0600838 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800839
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500840 pipeline_layout->layouts = intel_alloc(pipeline_layout,
841 sizeof(pipeline_layout->layouts[0]) * count,
842 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
843 if (!pipeline_layout->layouts) {
844 intel_pipeline_layout_destroy(pipeline_layout);
Tony Barbour8205d902015-04-16 15:59:00 -0600845 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800846 }
847
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500848 pipeline_layout->dynamic_desc_indices = intel_alloc(pipeline_layout,
849 sizeof(pipeline_layout->dynamic_desc_indices[0]) * count,
Tony Barbour8205d902015-04-16 15:59:00 -0600850 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500851 if (!pipeline_layout->dynamic_desc_indices) {
852 intel_pipeline_layout_destroy(pipeline_layout);
Tony Barbour8205d902015-04-16 15:59:00 -0600853 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wu862c5572015-03-28 15:23:55 +0800854 }
855
856 for (i = 0; i < count; i++) {
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500857 pipeline_layout->layouts[i] = intel_desc_layout(pPipelineCreateInfo->pSetLayouts[i]);
858 pipeline_layout->dynamic_desc_indices[i] = pipeline_layout->total_dynamic_desc_count;
Chia-I Wu862c5572015-03-28 15:23:55 +0800859
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500860 pipeline_layout->total_dynamic_desc_count +=
861 pipeline_layout->layouts[i]->dynamic_desc_count;
Chia-I Wu862c5572015-03-28 15:23:55 +0800862 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800863
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500864 pipeline_layout->layout_count = count;
Chia-I Wuf8385062015-01-04 16:27:24 +0800865
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500866 pipeline_layout->obj.destroy = pipeline_layout_destroy;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800867
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500868 *pipeline_layout_ret = pipeline_layout;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800869
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600870 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800871}
872
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500873void intel_pipeline_layout_destroy(struct intel_pipeline_layout *pipeline_layout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800874{
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500875 if (pipeline_layout->dynamic_desc_indices)
876 intel_free(pipeline_layout, pipeline_layout->dynamic_desc_indices);
877 if (pipeline_layout->layouts)
878 intel_free(pipeline_layout, pipeline_layout->layouts);
879 intel_base_destroy(&pipeline_layout->obj.base);
Chia-I Wuf8385062015-01-04 16:27:24 +0800880}
881
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600882ICD_EXPORT VkResult VKAPI vkCreateDescriptorSetLayout(
883 VkDevice device,
884 const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
885 VkDescriptorSetLayout* pSetLayout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800886{
887 struct intel_dev *dev = intel_dev(device);
Chia-I Wuf8385062015-01-04 16:27:24 +0800888
Chia-I Wu7732cb22015-03-26 15:27:55 +0800889 return intel_desc_layout_create(dev, pCreateInfo,
Chia-I Wuf8385062015-01-04 16:27:24 +0800890 (struct intel_desc_layout **) pSetLayout);
891}
892
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500893ICD_EXPORT VkResult VKAPI vkCreatePipelineLayout(
894 VkDevice device,
895 const VkPipelineLayoutCreateInfo* pCreateInfo,
896 VkPipelineLayout* pPipelineLayout)
Chia-I Wu7732cb22015-03-26 15:27:55 +0800897{
898 struct intel_dev *dev = intel_dev(device);
899
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500900 return intel_pipeline_layout_create(dev,
901 pCreateInfo,
902 (struct intel_pipeline_layout **) pPipelineLayout);
Chia-I Wu7732cb22015-03-26 15:27:55 +0800903}
904
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600905ICD_EXPORT VkResult VKAPI vkCreateDescriptorPool(
906 VkDevice device,
907 VkDescriptorPoolUsage poolUsage,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600908 uint32_t maxSets,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600909 const VkDescriptorPoolCreateInfo* pCreateInfo,
910 VkDescriptorPool* pDescriptorPool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800911{
912 struct intel_dev *dev = intel_dev(device);
913
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800914 return intel_desc_pool_create(dev, poolUsage, maxSets, pCreateInfo,
915 (struct intel_desc_pool **) pDescriptorPool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800916}
917
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600918ICD_EXPORT VkResult VKAPI vkResetDescriptorPool(
Mike Stroyan230e6252015-04-17 12:36:38 -0600919 VkDevice device,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600920 VkDescriptorPool descriptorPool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800921{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800922 struct intel_desc_pool *pool = intel_desc_pool(descriptorPool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800923
Chia-I Wudee95612015-03-26 15:23:52 +0800924 intel_desc_pool_reset(pool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800925
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600926 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800927}
928
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600929ICD_EXPORT VkResult VKAPI vkAllocDescriptorSets(
Mike Stroyan230e6252015-04-17 12:36:38 -0600930 VkDevice device,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600931 VkDescriptorPool descriptorPool,
932 VkDescriptorSetUsage setUsage,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600933 uint32_t count,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600934 const VkDescriptorSetLayout* pSetLayouts,
935 VkDescriptorSet* pDescriptorSets,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600936 uint32_t* pCount)
Chia-I Wuf8385062015-01-04 16:27:24 +0800937{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800938 struct intel_desc_pool *pool = intel_desc_pool(descriptorPool);
939 struct intel_dev *dev = pool->dev;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600940 VkResult ret = VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800941 uint32_t i;
942
943 for (i = 0; i < count; i++) {
944 const struct intel_desc_layout *layout =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600945 intel_desc_layout((VkDescriptorSetLayout) pSetLayouts[i]);
Chia-I Wuf8385062015-01-04 16:27:24 +0800946
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800947 ret = intel_desc_set_create(dev, pool, setUsage, layout,
Chia-I Wuf8385062015-01-04 16:27:24 +0800948 (struct intel_desc_set **) &pDescriptorSets[i]);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600949 if (ret != VK_SUCCESS)
Chia-I Wuf8385062015-01-04 16:27:24 +0800950 break;
951 }
952
953 if (pCount)
954 *pCount = i;
955
956 return ret;
957}
958
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600959ICD_EXPORT void VKAPI vkClearDescriptorSets(
Mike Stroyan230e6252015-04-17 12:36:38 -0600960 VkDevice device,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600961 VkDescriptorPool descriptorPool,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600962 uint32_t count,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600963 const VkDescriptorSet* pDescriptorSets)
Chia-I Wuf8385062015-01-04 16:27:24 +0800964{
965 uint32_t i;
966
967 for (i = 0; i < count; i++) {
968 struct intel_desc_set *set =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600969 intel_desc_set((VkDescriptorSet) pDescriptorSets[i]);
Chia-I Wuf8385062015-01-04 16:27:24 +0800970
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800971 intel_desc_region_clear(set->region, &set->region_begin, &set->region_end);
Chia-I Wuf8385062015-01-04 16:27:24 +0800972 }
973}
974
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600975ICD_EXPORT void VKAPI vkUpdateDescriptors(
Mike Stroyan230e6252015-04-17 12:36:38 -0600976 VkDevice device,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600977 VkDescriptorSet descriptorSet,
Chia-I Wu7732cb22015-03-26 15:27:55 +0800978 uint32_t updateCount,
979 const void** ppUpdateArray)
Chia-I Wuf8385062015-01-04 16:27:24 +0800980{
981 struct intel_desc_set *set = intel_desc_set(descriptorSet);
Chia-I Wu7732cb22015-03-26 15:27:55 +0800982 uint32_t i;
Chia-I Wuf8385062015-01-04 16:27:24 +0800983
Chia-I Wu7732cb22015-03-26 15:27:55 +0800984 for (i = 0; i < updateCount; i++) {
985 const union {
986 struct {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600987 VkStructureType sType;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800988 const void* pNext;
989 } common;
Chia-I Wuf8385062015-01-04 16:27:24 +0800990
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600991 VkUpdateSamplers samplers;
992 VkUpdateSamplerTextures sampler_textures;
993 VkUpdateImages images;
994 VkUpdateBuffers buffers;
995 VkUpdateAsCopy as_copy;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800996 } *u = ppUpdateArray[i];
997
Chia-I Wuf8385062015-01-04 16:27:24 +0800998 switch (u->common.sType) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600999 case VK_STRUCTURE_TYPE_UPDATE_SAMPLERS:
Chia-I Wuf8385062015-01-04 16:27:24 +08001000 intel_desc_set_update_samplers(set, &u->samplers);
1001 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001002 case VK_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
Chia-I Wuf8385062015-01-04 16:27:24 +08001003 intel_desc_set_update_sampler_textures(set, &u->sampler_textures);
1004 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001005 case VK_STRUCTURE_TYPE_UPDATE_IMAGES:
Chia-I Wuf8385062015-01-04 16:27:24 +08001006 intel_desc_set_update_images(set, &u->images);
1007 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001008 case VK_STRUCTURE_TYPE_UPDATE_BUFFERS:
Chia-I Wuf8385062015-01-04 16:27:24 +08001009 intel_desc_set_update_buffers(set, &u->buffers);
1010 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001011 case VK_STRUCTURE_TYPE_UPDATE_AS_COPY:
Chia-I Wuf8385062015-01-04 16:27:24 +08001012 intel_desc_set_update_as_copy(set, &u->as_copy);
1013 break;
1014 default:
1015 assert(!"unknown descriptor update");
1016 break;
1017 }
Chia-I Wuf8385062015-01-04 16:27:24 +08001018 }
1019}