blob: 9c863cd1fe023286b8fdb764f3ef5b143d933774 [file] [log] [blame]
Chia-I Wuf8385062015-01-04 16:27:24 +08001/*
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06002 * Vulkan
Chia-I Wuf8385062015-01-04 16:27:24 +08003 *
4 * Copyright (C) 2015 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *
24 * Authors:
25 * Chia-I Wu <olv@lunarg.com>
26 */
27
28#include "buf.h"
29#include "cmd.h"
30#include "dev.h"
31#include "gpu.h"
32#include "img.h"
33#include "sampler.h"
34#include "view.h"
35#include "desc.h"
36
37enum intel_desc_surface_type {
38 INTEL_DESC_SURFACE_UNUSED,
39 INTEL_DESC_SURFACE_BUF,
40 INTEL_DESC_SURFACE_IMG,
41};
42
43struct intel_desc_surface {
44 const struct intel_mem *mem;
45 bool read_only;
46
47 enum intel_desc_surface_type type;
48 union {
49 const void *unused;
50 const struct intel_buf_view *buf;
51 const struct intel_img_view *img;
52 } u;
53};
54
55struct intel_desc_sampler {
56 const struct intel_sampler *sampler;
57};
58
Chia-I Wu7732cb22015-03-26 15:27:55 +080059bool intel_desc_iter_init_for_binding(struct intel_desc_iter *iter,
60 const struct intel_desc_layout *layout,
61 uint32_t binding_index, uint32_t array_base)
62{
63 const struct intel_desc_layout_binding *binding;
64
65 if (binding_index >= layout->binding_count ||
66 array_base >= layout->bindings[binding_index].array_size)
67 return false;
68
69 binding = &layout->bindings[binding_index];
70
71 iter->type = binding->type;
72 iter->increment = binding->increment;
73 iter->size = binding->array_size;
74
75 intel_desc_offset_mad(&iter->begin, &binding->increment,
76 &binding->offset, array_base);
77 intel_desc_offset_add(&iter->end, &iter->begin, &binding->increment);
78 iter->cur = array_base;
79
80 return true;
81}
82
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +080083static bool desc_iter_init_for_writing(struct intel_desc_iter *iter,
84 const struct intel_desc_set *set,
85 uint32_t binding_index, uint32_t array_base)
Chia-I Wu7732cb22015-03-26 15:27:55 +080086{
87 if (!intel_desc_iter_init_for_binding(iter, set->layout,
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +080088 binding_index, array_base))
Chia-I Wu7732cb22015-03-26 15:27:55 +080089 return false;
90
91 intel_desc_offset_add(&iter->begin, &iter->begin, &set->region_begin);
92 intel_desc_offset_add(&iter->end, &iter->end, &set->region_begin);
93
94 return true;
95}
96
97bool intel_desc_iter_advance(struct intel_desc_iter *iter)
98{
99 if (iter->cur >= iter->size)
100 return false;
101
102 iter->cur++;
103
104 iter->begin = iter->end;
105 intel_desc_offset_add(&iter->end, &iter->end, &iter->increment);
106
107 return true;
108}
109
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800110static bool desc_region_init_desc_sizes(struct intel_desc_region *region,
111 const struct intel_gpu *gpu)
Chia-I Wuf8385062015-01-04 16:27:24 +0800112{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800113 region->surface_desc_size = sizeof(struct intel_desc_surface);
114 region->sampler_desc_size = sizeof(struct intel_desc_sampler);
Chia-I Wuf8385062015-01-04 16:27:24 +0800115
116 return true;
117}
118
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600119VkResult intel_desc_region_create(struct intel_dev *dev,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800120 struct intel_desc_region **region_ret)
Chia-I Wuf8385062015-01-04 16:27:24 +0800121{
122 const uint32_t surface_count = 16384;
123 const uint32_t sampler_count = 16384;
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800124 struct intel_desc_region *region;
Chia-I Wuf8385062015-01-04 16:27:24 +0800125
Tony Barbour8205d902015-04-16 15:59:00 -0600126 region = intel_alloc(dev, sizeof(*region), 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800127 if (!region)
Tony Barbour8205d902015-04-16 15:59:00 -0600128 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800129
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800130 memset(region, 0, sizeof(*region));
Chia-I Wuf8385062015-01-04 16:27:24 +0800131
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800132 if (!desc_region_init_desc_sizes(region, dev->gpu)) {
133 intel_free(dev, region);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600134 return VK_ERROR_UNKNOWN;
Chia-I Wuf8385062015-01-04 16:27:24 +0800135 }
136
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800137 intel_desc_offset_set(&region->size,
138 region->surface_desc_size * surface_count,
139 region->sampler_desc_size * sampler_count);
Chia-I Wuf8385062015-01-04 16:27:24 +0800140
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800141 region->surfaces = intel_alloc(dev, region->size.surface,
Tony Barbour8205d902015-04-16 15:59:00 -0600142 64, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800143 if (!region->surfaces) {
144 intel_free(dev, region);
Tony Barbour8205d902015-04-16 15:59:00 -0600145 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800146 }
147
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800148 region->samplers = intel_alloc(dev, region->size.sampler,
Tony Barbour8205d902015-04-16 15:59:00 -0600149 64, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800150 if (!region->samplers) {
151 intel_free(dev, region->surfaces);
152 intel_free(dev, region);
Tony Barbour8205d902015-04-16 15:59:00 -0600153 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800154 }
155
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800156 *region_ret = region;
Chia-I Wuf8385062015-01-04 16:27:24 +0800157
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600158 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800159}
160
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800161void intel_desc_region_destroy(struct intel_dev *dev,
162 struct intel_desc_region *region)
Chia-I Wuf8385062015-01-04 16:27:24 +0800163{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800164 intel_free(dev, region->samplers);
165 intel_free(dev, region->surfaces);
166 intel_free(dev, region);
Chia-I Wuf8385062015-01-04 16:27:24 +0800167}
168
169/**
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800170 * Get the size of a descriptor in the region.
Chia-I Wuf8385062015-01-04 16:27:24 +0800171 */
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600172static VkResult desc_region_get_desc_size(const struct intel_desc_region *region,
173 VkDescriptorType type,
Chia-I Wuf8385062015-01-04 16:27:24 +0800174 struct intel_desc_offset *size)
175{
176 uint32_t surface_size = 0, sampler_size = 0;
177
178 switch (type) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600179 case VK_DESCRIPTOR_TYPE_SAMPLER:
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800180 sampler_size = region->sampler_desc_size;
Chia-I Wuf8385062015-01-04 16:27:24 +0800181 break;
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600182 case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800183 surface_size = region->surface_desc_size;
184 sampler_size = region->sampler_desc_size;
Chia-I Wuf8385062015-01-04 16:27:24 +0800185 break;
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600186 case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
187 case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
188 case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
189 case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600190 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600191 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600192 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600193 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800194 surface_size = region->surface_desc_size;
Chia-I Wuf8385062015-01-04 16:27:24 +0800195 break;
196 default:
197 assert(!"unknown descriptor type");
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600198 return VK_ERROR_INVALID_VALUE;
Chia-I Wuf8385062015-01-04 16:27:24 +0800199 break;
200 }
201
202 intel_desc_offset_set(size, surface_size, sampler_size);
203
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600204 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800205}
206
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600207VkResult intel_desc_region_alloc(struct intel_desc_region *region,
208 const VkDescriptorPoolCreateInfo *info,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800209 struct intel_desc_offset *begin,
210 struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800211{
212 uint32_t surface_size = 0, sampler_size = 0;
213 struct intel_desc_offset alloc;
214 uint32_t i;
215
216 /* calculate sizes needed */
217 for (i = 0; i < info->count; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600218 const VkDescriptorTypeCount *tc = &info->pTypeCount[i];
Chia-I Wuf8385062015-01-04 16:27:24 +0800219 struct intel_desc_offset size;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600220 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800221
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800222 ret = desc_region_get_desc_size(region, tc->type, &size);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600223 if (ret != VK_SUCCESS)
Chia-I Wuf8385062015-01-04 16:27:24 +0800224 return ret;
225
226 surface_size += size.surface * tc->count;
227 sampler_size += size.sampler * tc->count;
228 }
229
230 intel_desc_offset_set(&alloc, surface_size, sampler_size);
231
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800232 *begin = region->cur;
233 intel_desc_offset_add(end, &region->cur, &alloc);
Chia-I Wuf8385062015-01-04 16:27:24 +0800234
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800235 if (!intel_desc_offset_within(end, &region->size))
Tony Barbour8205d902015-04-16 15:59:00 -0600236 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800237
238 /* increment the writer pointer */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800239 region->cur = *end;
Chia-I Wuf8385062015-01-04 16:27:24 +0800240
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600241 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800242}
243
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800244static void desc_region_validate_begin_end(const struct intel_desc_region *region,
245 const struct intel_desc_offset *begin,
246 const struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800247{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800248 assert(begin->surface % region->surface_desc_size == 0 &&
249 begin->sampler % region->sampler_desc_size == 0);
250 assert(end->surface % region->surface_desc_size == 0 &&
251 end->sampler % region->sampler_desc_size == 0);
252 assert(intel_desc_offset_within(end, &region->size));
Chia-I Wuf8385062015-01-04 16:27:24 +0800253}
254
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800255void intel_desc_region_free(struct intel_desc_region *region,
256 const struct intel_desc_offset *begin,
257 const struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800258{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800259 desc_region_validate_begin_end(region, begin, end);
Chia-I Wuf8385062015-01-04 16:27:24 +0800260
261 /* is it ok not to reclaim? */
262}
263
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800264void intel_desc_region_clear(struct intel_desc_region *region,
265 const struct intel_desc_offset *begin,
266 const struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800267{
268 uint32_t i;
269
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800270 desc_region_validate_begin_end(region, begin, end);
Chia-I Wuf8385062015-01-04 16:27:24 +0800271
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800272 for (i = begin->surface; i < end->surface; i += region->surface_desc_size) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800273 struct intel_desc_surface *desc = (struct intel_desc_surface *)
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800274 ((char *) region->surfaces + i);
Chia-I Wuf8385062015-01-04 16:27:24 +0800275
276 desc->mem = NULL;
277 desc->type = INTEL_DESC_SURFACE_UNUSED;
278 desc->u.unused = NULL;
279 }
280
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800281 for (i = begin->sampler; i < end->sampler; i += region->sampler_desc_size) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800282 struct intel_desc_sampler *desc = (struct intel_desc_sampler *)
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800283 ((char *) region->samplers + i);
Chia-I Wuf8385062015-01-04 16:27:24 +0800284
285 desc->sampler = NULL;
286 }
287}
288
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800289void intel_desc_region_update(struct intel_desc_region *region,
290 const struct intel_desc_offset *begin,
291 const struct intel_desc_offset *end,
292 const struct intel_desc_surface *surfaces,
293 const struct intel_desc_sampler *samplers)
Chia-I Wuf8385062015-01-04 16:27:24 +0800294{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800295 desc_region_validate_begin_end(region, begin, end);
Chia-I Wuf8385062015-01-04 16:27:24 +0800296
297 if (begin->surface < end->surface) {
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800298 memcpy((char *) region->surfaces + begin->surface, surfaces,
Chia-I Wuf8385062015-01-04 16:27:24 +0800299 end->surface - begin->surface);
300 }
301
302 if (begin->sampler < end->sampler) {
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800303 memcpy((char *) region->samplers + begin->sampler, samplers,
Chia-I Wuf8385062015-01-04 16:27:24 +0800304 end->sampler - begin->sampler);
305 }
306}
307
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800308void intel_desc_region_copy(struct intel_desc_region *region,
309 const struct intel_desc_offset *begin,
310 const struct intel_desc_offset *end,
311 const struct intel_desc_offset *src)
Chia-I Wuf8385062015-01-04 16:27:24 +0800312{
313 struct intel_desc_offset src_end;
314 const struct intel_desc_surface *surfaces;
315 const struct intel_desc_sampler *samplers;
316
317 /* no overlap */
318 assert(intel_desc_offset_within(src, begin) ||
319 intel_desc_offset_within(end, src));
320
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800321 /* no read past region */
Chia-I Wuf8385062015-01-04 16:27:24 +0800322 intel_desc_offset_sub(&src_end, end, begin);
323 intel_desc_offset_add(&src_end, src, &src_end);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800324 assert(intel_desc_offset_within(&src_end, &region->size));
Chia-I Wuf8385062015-01-04 16:27:24 +0800325
326 surfaces = (const struct intel_desc_surface *)
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800327 ((const char *) region->surfaces + src->surface);
Tony Barbour379e0a72015-02-05 11:09:34 -0700328 samplers = (const struct intel_desc_sampler *)
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800329 ((const char *) region->samplers + src->sampler);
Chia-I Wuf8385062015-01-04 16:27:24 +0800330
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800331 intel_desc_region_update(region, begin, end, surfaces, samplers);
Chia-I Wuf8385062015-01-04 16:27:24 +0800332}
333
Chia-I Wu862c5572015-03-28 15:23:55 +0800334void intel_desc_region_read_surface(const struct intel_desc_region *region,
335 const struct intel_desc_offset *offset,
Tony Barbour8205d902015-04-16 15:59:00 -0600336 VkShaderStage stage,
Chia-I Wu862c5572015-03-28 15:23:55 +0800337 const struct intel_mem **mem,
338 bool *read_only,
339 const uint32_t **cmd,
340 uint32_t *cmd_len)
341{
342 const struct intel_desc_surface *desc;
343 struct intel_desc_offset end;
344
345 intel_desc_offset_set(&end,
346 offset->surface + region->surface_desc_size, offset->sampler);
347 desc_region_validate_begin_end(region, offset, &end);
348
349 desc = (const struct intel_desc_surface *)
350 ((const char *) region->surfaces + offset->surface);
351
352 *mem = desc->mem;
353 *read_only = desc->read_only;
354 switch (desc->type) {
355 case INTEL_DESC_SURFACE_BUF:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600356 *cmd = (stage == VK_SHADER_STAGE_FRAGMENT) ?
Chia-I Wu862c5572015-03-28 15:23:55 +0800357 desc->u.buf->fs_cmd : desc->u.buf->cmd;
358 *cmd_len = desc->u.buf->cmd_len;
359 break;
360 case INTEL_DESC_SURFACE_IMG:
361 *cmd = desc->u.img->cmd;
362 *cmd_len = desc->u.img->cmd_len;
363 break;
364 case INTEL_DESC_SURFACE_UNUSED:
365 default:
366 *cmd = NULL;
367 *cmd_len = 0;
368 break;
369 }
370}
371
372void intel_desc_region_read_sampler(const struct intel_desc_region *region,
373 const struct intel_desc_offset *offset,
374 const struct intel_sampler **sampler)
375{
376 const struct intel_desc_sampler *desc;
377 struct intel_desc_offset end;
378
379 intel_desc_offset_set(&end,
380 offset->surface, offset->sampler + region->sampler_desc_size);
381 desc_region_validate_begin_end(region, offset, &end);
382
383 desc = (const struct intel_desc_sampler *)
384 ((const char *) region->samplers + offset->sampler);
385
386 *sampler = desc->sampler;
387}
388
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800389static void desc_pool_destroy(struct intel_obj *obj)
Chia-I Wuf8385062015-01-04 16:27:24 +0800390{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800391 struct intel_desc_pool *pool = intel_desc_pool_from_obj(obj);
Chia-I Wuf8385062015-01-04 16:27:24 +0800392
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800393 intel_desc_pool_destroy(pool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800394}
395
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600396VkResult intel_desc_pool_create(struct intel_dev *dev,
397 VkDescriptorPoolUsage usage,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800398 uint32_t max_sets,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600399 const VkDescriptorPoolCreateInfo *info,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800400 struct intel_desc_pool **pool_ret)
Chia-I Wuf8385062015-01-04 16:27:24 +0800401{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800402 struct intel_desc_pool *pool;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600403 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800404
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800405 pool = (struct intel_desc_pool *) intel_base_create(&dev->base.handle,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600406 sizeof(*pool), dev->base.dbg, VK_OBJECT_TYPE_DESCRIPTOR_POOL,
Chia-I Wu545c2e12015-02-22 13:19:54 +0800407 info, 0);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800408 if (!pool)
Tony Barbour8205d902015-04-16 15:59:00 -0600409 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800410
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800411 pool->dev = dev;
Chia-I Wuf8385062015-01-04 16:27:24 +0800412
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800413 ret = intel_desc_region_alloc(dev->desc_region, info,
414 &pool->region_begin, &pool->region_end);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600415 if (ret != VK_SUCCESS) {
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800416 intel_base_destroy(&pool->obj.base);
Chia-I Wuf8385062015-01-04 16:27:24 +0800417 return ret;
418 }
419
420 /* point to head */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800421 pool->cur = pool->region_begin;
Chia-I Wuf8385062015-01-04 16:27:24 +0800422
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800423 pool->obj.destroy = desc_pool_destroy;
Chia-I Wuf8385062015-01-04 16:27:24 +0800424
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800425 *pool_ret = pool;
Chia-I Wuf8385062015-01-04 16:27:24 +0800426
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600427 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800428}
429
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800430void intel_desc_pool_destroy(struct intel_desc_pool *pool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800431{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800432 intel_desc_region_free(pool->dev->desc_region,
433 &pool->region_begin, &pool->region_end);
434 intel_base_destroy(&pool->obj.base);
Chia-I Wuf8385062015-01-04 16:27:24 +0800435}
436
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600437VkResult intel_desc_pool_alloc(struct intel_desc_pool *pool,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800438 const struct intel_desc_layout *layout,
439 struct intel_desc_offset *begin,
440 struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800441{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800442 *begin = pool->cur;
443 intel_desc_offset_add(end, &pool->cur, &layout->region_size);
Chia-I Wuf8385062015-01-04 16:27:24 +0800444
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800445 if (!intel_desc_offset_within(end, &pool->region_end))
Tony Barbour8205d902015-04-16 15:59:00 -0600446 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800447
448 /* increment the writer pointer */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800449 pool->cur = *end;
Chia-I Wuf8385062015-01-04 16:27:24 +0800450
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600451 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800452}
453
Chia-I Wudee95612015-03-26 15:23:52 +0800454void intel_desc_pool_reset(struct intel_desc_pool *pool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800455{
456 /* reset to head */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800457 pool->cur = pool->region_begin;
Chia-I Wuf8385062015-01-04 16:27:24 +0800458}
459
460static void desc_set_destroy(struct intel_obj *obj)
461{
462 struct intel_desc_set *set = intel_desc_set_from_obj(obj);
463
464 intel_desc_set_destroy(set);
465}
466
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600467VkResult intel_desc_set_create(struct intel_dev *dev,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800468 struct intel_desc_pool *pool,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600469 VkDescriptorSetUsage usage,
Chia-I Wuf8385062015-01-04 16:27:24 +0800470 const struct intel_desc_layout *layout,
471 struct intel_desc_set **set_ret)
472{
473 struct intel_desc_set *set;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600474 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800475
Chia-I Wu545c2e12015-02-22 13:19:54 +0800476 set = (struct intel_desc_set *) intel_base_create(&dev->base.handle,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600477 sizeof(*set), dev->base.dbg, VK_OBJECT_TYPE_DESCRIPTOR_SET,
Chia-I Wu545c2e12015-02-22 13:19:54 +0800478 NULL, 0);
Chia-I Wuf8385062015-01-04 16:27:24 +0800479 if (!set)
Tony Barbour8205d902015-04-16 15:59:00 -0600480 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800481
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800482 set->region = dev->desc_region;
483 ret = intel_desc_pool_alloc(pool, layout,
484 &set->region_begin, &set->region_end);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600485 if (ret != VK_SUCCESS) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800486 intel_base_destroy(&set->obj.base);
487 return ret;
488 }
489
490 set->layout = layout;
491
492 set->obj.destroy = desc_set_destroy;
493
494 *set_ret = set;
495
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600496 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800497}
498
499void intel_desc_set_destroy(struct intel_desc_set *set)
500{
501 intel_base_destroy(&set->obj.base);
502}
503
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600504static bool desc_set_img_layout_read_only(VkImageLayout layout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800505{
506 switch (layout) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600507 case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
508 case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
509 case VK_IMAGE_LAYOUT_TRANSFER_SOURCE_OPTIMAL:
Chia-I Wuf8385062015-01-04 16:27:24 +0800510 return true;
511 default:
512 return false;
513 }
514}
515
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800516static void desc_set_write_sampler(struct intel_desc_set *set,
517 const struct intel_desc_iter *iter,
518 const struct intel_sampler *sampler)
Chia-I Wuf8385062015-01-04 16:27:24 +0800519{
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800520 struct intel_desc_sampler desc;
Chia-I Wuf8385062015-01-04 16:27:24 +0800521
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800522 desc.sampler = sampler;
523 intel_desc_region_update(set->region, &iter->begin, &iter->end,
524 NULL, &desc);
Chia-I Wuf8385062015-01-04 16:27:24 +0800525}
526
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800527static void desc_set_write_combined_image_sampler(struct intel_desc_set *set,
528 const struct intel_desc_iter *iter,
529 const struct intel_img_view *img_view,
530 VkImageLayout img_layout,
531 const struct intel_sampler *sampler)
Chia-I Wuf8385062015-01-04 16:27:24 +0800532{
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800533 struct intel_desc_surface view_desc;
534 struct intel_desc_sampler sampler_desc;
Chia-I Wuf8385062015-01-04 16:27:24 +0800535
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800536 view_desc.mem = img_view->img->obj.mem;
537 view_desc.read_only = desc_set_img_layout_read_only(img_layout);
538 view_desc.type = INTEL_DESC_SURFACE_IMG;
539 view_desc.u.img = img_view;
Chia-I Wuf8385062015-01-04 16:27:24 +0800540
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800541 sampler_desc.sampler = sampler;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800542
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800543 intel_desc_region_update(set->region, &iter->begin, &iter->end,
544 &view_desc, &sampler_desc);
Chia-I Wuf8385062015-01-04 16:27:24 +0800545}
546
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800547static void desc_set_write_image(struct intel_desc_set *set,
548 const struct intel_desc_iter *iter,
549 const struct intel_img_view *img_view,
550 VkImageLayout img_layout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800551{
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800552 struct intel_desc_surface desc;
Chia-I Wuf8385062015-01-04 16:27:24 +0800553
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800554 desc.mem = img_view->img->obj.mem;
555 desc.read_only = desc_set_img_layout_read_only(img_layout);
556 desc.type = INTEL_DESC_SURFACE_IMG;
557 desc.u.img = img_view;
558 intel_desc_region_update(set->region, &iter->begin, &iter->end,
559 &desc, NULL);
Chia-I Wuf8385062015-01-04 16:27:24 +0800560}
561
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800562static void desc_set_write_buffer(struct intel_desc_set *set,
563 const struct intel_desc_iter *iter,
564 const struct intel_buf_view *buf_view)
Chia-I Wuf8385062015-01-04 16:27:24 +0800565{
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800566 struct intel_desc_surface desc;
Chia-I Wuf8385062015-01-04 16:27:24 +0800567
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800568 desc.mem = buf_view->buf->obj.mem;
569 desc.read_only = false;
570 desc.type = INTEL_DESC_SURFACE_BUF;
571 desc.u.buf = buf_view;
572 intel_desc_region_update(set->region, &iter->begin, &iter->end,
573 &desc, NULL);
Chia-I Wuf8385062015-01-04 16:27:24 +0800574}
575
576static void desc_layout_destroy(struct intel_obj *obj)
577{
578 struct intel_desc_layout *layout = intel_desc_layout_from_obj(obj);
579
580 intel_desc_layout_destroy(layout);
581}
582
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600583static VkResult desc_layout_init_bindings(struct intel_desc_layout *layout,
Chia-I Wufc9d9132015-03-26 15:04:41 +0800584 const struct intel_desc_region *region,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600585 const VkDescriptorSetLayoutCreateInfo *info)
Chia-I Wuf8385062015-01-04 16:27:24 +0800586{
587 struct intel_desc_offset offset;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800588 uint32_t i;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600589 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800590
Chia-I Wu7732cb22015-03-26 15:27:55 +0800591 intel_desc_offset_set(&offset, 0, 0);
Chia-I Wuf8385062015-01-04 16:27:24 +0800592
Chia-I Wufc9d9132015-03-26 15:04:41 +0800593 /* allocate bindings */
594 layout->bindings = intel_alloc(layout, sizeof(layout->bindings[0]) *
Tony Barbour8205d902015-04-16 15:59:00 -0600595 info->count, 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wufc9d9132015-03-26 15:04:41 +0800596 if (!layout->bindings)
Tony Barbour8205d902015-04-16 15:59:00 -0600597 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wufc9d9132015-03-26 15:04:41 +0800598
599 memset(layout->bindings, 0, sizeof(layout->bindings[0]) * info->count);
600 layout->binding_count = info->count;
601
602 /* initialize bindings */
603 for (i = 0; i < info->count; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600604 const VkDescriptorSetLayoutBinding *lb = &info->pBinding[i];
Chia-I Wufc9d9132015-03-26 15:04:41 +0800605 struct intel_desc_layout_binding *binding = &layout->bindings[i];
Chia-I Wuf8385062015-01-04 16:27:24 +0800606 struct intel_desc_offset size;
607
Chia-I Wufc9d9132015-03-26 15:04:41 +0800608 switch (lb->descriptorType) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600609 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600610 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
Chia-I Wud3114a22015-05-25 16:22:52 +0800611 layout->dynamic_desc_count += lb->arraySize;
Chia-I Wufc9d9132015-03-26 15:04:41 +0800612 break;
613 default:
614 break;
615 }
616
Chia-I Wu7732cb22015-03-26 15:27:55 +0800617 /* lb->stageFlags does not gain us anything */
618 binding->type = lb->descriptorType;
Chia-I Wud3114a22015-05-25 16:22:52 +0800619 binding->array_size = lb->arraySize;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800620 binding->offset = offset;
621
Chia-I Wufc9d9132015-03-26 15:04:41 +0800622 ret = desc_region_get_desc_size(region,
623 lb->descriptorType, &size);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600624 if (ret != VK_SUCCESS)
Chia-I Wuf8385062015-01-04 16:27:24 +0800625 return ret;
626
Chia-I Wu310eece2015-03-27 12:56:09 +0800627 binding->increment = size;
628
629 /* copy immutable samplers */
630 if (lb->pImmutableSamplers) {
631 bool shared = true;
632 uint32_t j;
633
Chia-I Wud3114a22015-05-25 16:22:52 +0800634 for (j = 1; j < lb->arraySize; j++) {
Chia-I Wu310eece2015-03-27 12:56:09 +0800635 if (lb->pImmutableSamplers[j] != lb->pImmutableSamplers[0]) {
636 shared = false;
637 break;
638 }
639 }
640
641 if (shared) {
642 binding->shared_immutable_sampler =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600643 intel_sampler((VkSampler) lb->pImmutableSamplers[0]);
Chia-I Wu310eece2015-03-27 12:56:09 +0800644 /* set sampler offset increment to 0 */
645 intel_desc_offset_set(&binding->increment,
646 binding->increment.surface, 0);
647 } else {
648 binding->immutable_samplers = intel_alloc(layout,
Chia-I Wud3114a22015-05-25 16:22:52 +0800649 sizeof(binding->immutable_samplers[0]) * lb->arraySize,
Tony Barbour8205d902015-04-16 15:59:00 -0600650 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu310eece2015-03-27 12:56:09 +0800651 if (!binding->immutable_samplers)
Tony Barbour8205d902015-04-16 15:59:00 -0600652 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wu310eece2015-03-27 12:56:09 +0800653
Chia-I Wud3114a22015-05-25 16:22:52 +0800654 for (j = 0; j < lb->arraySize; j++) {
Chia-I Wu310eece2015-03-27 12:56:09 +0800655 binding->immutable_samplers[j] =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600656 intel_sampler((VkSampler) lb->pImmutableSamplers[j]);
Chia-I Wu310eece2015-03-27 12:56:09 +0800657 }
658 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800659 }
660
Chia-I Wu7732cb22015-03-26 15:27:55 +0800661 /* increment offset */
Chia-I Wufc9d9132015-03-26 15:04:41 +0800662 intel_desc_offset_mad(&size, &binding->increment, &size,
Chia-I Wud3114a22015-05-25 16:22:52 +0800663 lb->arraySize - 1);
Chia-I Wuf8385062015-01-04 16:27:24 +0800664 intel_desc_offset_add(&offset, &offset, &size);
Chia-I Wuf8385062015-01-04 16:27:24 +0800665 }
666
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800667 layout->region_size = offset;
Chia-I Wuf8385062015-01-04 16:27:24 +0800668
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600669 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800670}
671
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600672VkResult intel_desc_layout_create(struct intel_dev *dev,
673 const VkDescriptorSetLayoutCreateInfo *info,
Chia-I Wuf8385062015-01-04 16:27:24 +0800674 struct intel_desc_layout **layout_ret)
675{
676 struct intel_desc_layout *layout;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600677 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800678
Chia-I Wu545c2e12015-02-22 13:19:54 +0800679 layout = (struct intel_desc_layout *) intel_base_create(&dev->base.handle,
680 sizeof(*layout), dev->base.dbg,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600681 VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, info, 0);
Chia-I Wuf8385062015-01-04 16:27:24 +0800682 if (!layout)
Tony Barbour8205d902015-04-16 15:59:00 -0600683 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800684
Chia-I Wu7732cb22015-03-26 15:27:55 +0800685 ret = desc_layout_init_bindings(layout, dev->desc_region, info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600686 if (ret != VK_SUCCESS) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800687 intel_desc_layout_destroy(layout);
688 return ret;
689 }
690
691 layout->obj.destroy = desc_layout_destroy;
692
693 *layout_ret = layout;
694
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600695 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800696}
697
698void intel_desc_layout_destroy(struct intel_desc_layout *layout)
699{
Chia-I Wu310eece2015-03-27 12:56:09 +0800700 uint32_t i;
701
702 for (i = 0; i < layout->binding_count; i++) {
703 struct intel_desc_layout_binding *binding = &layout->bindings[i];
704
705 if (binding->immutable_samplers)
706 intel_free(layout, binding->immutable_samplers);
707 }
Chia-I Wufc9d9132015-03-26 15:04:41 +0800708 intel_free(layout, layout->bindings);
Chia-I Wuf8385062015-01-04 16:27:24 +0800709 intel_base_destroy(&layout->obj.base);
710}
711
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500712static void pipeline_layout_destroy(struct intel_obj *obj)
Chia-I Wuf8385062015-01-04 16:27:24 +0800713{
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500714 struct intel_pipeline_layout *pipeline_layout =
715 intel_pipeline_layout_from_obj(obj);
Chia-I Wuf8385062015-01-04 16:27:24 +0800716
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500717 intel_pipeline_layout_destroy(pipeline_layout);
Chia-I Wuf8385062015-01-04 16:27:24 +0800718}
719
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500720VkResult intel_pipeline_layout_create(struct intel_dev *dev,
721 const VkPipelineLayoutCreateInfo *pPipelineCreateInfo,
722 struct intel_pipeline_layout **pipeline_layout_ret)
Chia-I Wuf8385062015-01-04 16:27:24 +0800723{
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500724 struct intel_pipeline_layout *pipeline_layout;
725 uint32_t count = pPipelineCreateInfo->descriptorSetCount;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800726 uint32_t i;
727
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500728 pipeline_layout = (struct intel_pipeline_layout *) intel_base_create(
729 &dev->base.handle, sizeof(*pipeline_layout), dev->base.dbg,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600730 VK_OBJECT_TYPE_PIPELINE_LAYOUT, NULL, 0);
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500731
732 if (!pipeline_layout)
Tony Barbour8205d902015-04-16 15:59:00 -0600733 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800734
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500735 pipeline_layout->layouts = intel_alloc(pipeline_layout,
736 sizeof(pipeline_layout->layouts[0]) * count,
737 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
738 if (!pipeline_layout->layouts) {
739 intel_pipeline_layout_destroy(pipeline_layout);
Tony Barbour8205d902015-04-16 15:59:00 -0600740 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800741 }
742
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500743 pipeline_layout->dynamic_desc_indices = intel_alloc(pipeline_layout,
744 sizeof(pipeline_layout->dynamic_desc_indices[0]) * count,
Tony Barbour8205d902015-04-16 15:59:00 -0600745 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500746 if (!pipeline_layout->dynamic_desc_indices) {
747 intel_pipeline_layout_destroy(pipeline_layout);
Tony Barbour8205d902015-04-16 15:59:00 -0600748 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wu862c5572015-03-28 15:23:55 +0800749 }
750
751 for (i = 0; i < count; i++) {
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500752 pipeline_layout->layouts[i] = intel_desc_layout(pPipelineCreateInfo->pSetLayouts[i]);
753 pipeline_layout->dynamic_desc_indices[i] = pipeline_layout->total_dynamic_desc_count;
Chia-I Wu862c5572015-03-28 15:23:55 +0800754
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500755 pipeline_layout->total_dynamic_desc_count +=
756 pipeline_layout->layouts[i]->dynamic_desc_count;
Chia-I Wu862c5572015-03-28 15:23:55 +0800757 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800758
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500759 pipeline_layout->layout_count = count;
Chia-I Wuf8385062015-01-04 16:27:24 +0800760
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500761 pipeline_layout->obj.destroy = pipeline_layout_destroy;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800762
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500763 *pipeline_layout_ret = pipeline_layout;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800764
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600765 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800766}
767
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500768void intel_pipeline_layout_destroy(struct intel_pipeline_layout *pipeline_layout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800769{
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500770 if (pipeline_layout->dynamic_desc_indices)
771 intel_free(pipeline_layout, pipeline_layout->dynamic_desc_indices);
772 if (pipeline_layout->layouts)
773 intel_free(pipeline_layout, pipeline_layout->layouts);
774 intel_base_destroy(&pipeline_layout->obj.base);
Chia-I Wuf8385062015-01-04 16:27:24 +0800775}
776
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600777ICD_EXPORT VkResult VKAPI vkCreateDescriptorSetLayout(
778 VkDevice device,
779 const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
780 VkDescriptorSetLayout* pSetLayout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800781{
782 struct intel_dev *dev = intel_dev(device);
Chia-I Wuf8385062015-01-04 16:27:24 +0800783
Chia-I Wu7732cb22015-03-26 15:27:55 +0800784 return intel_desc_layout_create(dev, pCreateInfo,
Chia-I Wuf8385062015-01-04 16:27:24 +0800785 (struct intel_desc_layout **) pSetLayout);
786}
787
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500788ICD_EXPORT VkResult VKAPI vkCreatePipelineLayout(
789 VkDevice device,
790 const VkPipelineLayoutCreateInfo* pCreateInfo,
791 VkPipelineLayout* pPipelineLayout)
Chia-I Wu7732cb22015-03-26 15:27:55 +0800792{
793 struct intel_dev *dev = intel_dev(device);
794
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500795 return intel_pipeline_layout_create(dev,
796 pCreateInfo,
797 (struct intel_pipeline_layout **) pPipelineLayout);
Chia-I Wu7732cb22015-03-26 15:27:55 +0800798}
799
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600800ICD_EXPORT VkResult VKAPI vkCreateDescriptorPool(
801 VkDevice device,
802 VkDescriptorPoolUsage poolUsage,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600803 uint32_t maxSets,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600804 const VkDescriptorPoolCreateInfo* pCreateInfo,
805 VkDescriptorPool* pDescriptorPool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800806{
807 struct intel_dev *dev = intel_dev(device);
808
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800809 return intel_desc_pool_create(dev, poolUsage, maxSets, pCreateInfo,
810 (struct intel_desc_pool **) pDescriptorPool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800811}
812
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600813ICD_EXPORT VkResult VKAPI vkResetDescriptorPool(
Mike Stroyan230e6252015-04-17 12:36:38 -0600814 VkDevice device,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600815 VkDescriptorPool descriptorPool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800816{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800817 struct intel_desc_pool *pool = intel_desc_pool(descriptorPool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800818
Chia-I Wudee95612015-03-26 15:23:52 +0800819 intel_desc_pool_reset(pool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800820
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600821 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800822}
823
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600824ICD_EXPORT VkResult VKAPI vkAllocDescriptorSets(
Mike Stroyan230e6252015-04-17 12:36:38 -0600825 VkDevice device,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600826 VkDescriptorPool descriptorPool,
827 VkDescriptorSetUsage setUsage,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600828 uint32_t count,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600829 const VkDescriptorSetLayout* pSetLayouts,
830 VkDescriptorSet* pDescriptorSets,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600831 uint32_t* pCount)
Chia-I Wuf8385062015-01-04 16:27:24 +0800832{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800833 struct intel_desc_pool *pool = intel_desc_pool(descriptorPool);
834 struct intel_dev *dev = pool->dev;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600835 VkResult ret = VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800836 uint32_t i;
837
838 for (i = 0; i < count; i++) {
839 const struct intel_desc_layout *layout =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600840 intel_desc_layout((VkDescriptorSetLayout) pSetLayouts[i]);
Chia-I Wuf8385062015-01-04 16:27:24 +0800841
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800842 ret = intel_desc_set_create(dev, pool, setUsage, layout,
Chia-I Wuf8385062015-01-04 16:27:24 +0800843 (struct intel_desc_set **) &pDescriptorSets[i]);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600844 if (ret != VK_SUCCESS)
Chia-I Wuf8385062015-01-04 16:27:24 +0800845 break;
846 }
847
848 if (pCount)
849 *pCount = i;
850
851 return ret;
852}
853
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600854ICD_EXPORT void VKAPI vkClearDescriptorSets(
Mike Stroyan230e6252015-04-17 12:36:38 -0600855 VkDevice device,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600856 VkDescriptorPool descriptorPool,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600857 uint32_t count,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600858 const VkDescriptorSet* pDescriptorSets)
Chia-I Wuf8385062015-01-04 16:27:24 +0800859{
860 uint32_t i;
861
862 for (i = 0; i < count; i++) {
863 struct intel_desc_set *set =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600864 intel_desc_set((VkDescriptorSet) pDescriptorSets[i]);
Chia-I Wuf8385062015-01-04 16:27:24 +0800865
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800866 intel_desc_region_clear(set->region, &set->region_begin, &set->region_end);
Chia-I Wuf8385062015-01-04 16:27:24 +0800867 }
868}
869
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800870ICD_EXPORT VkResult VKAPI vkUpdateDescriptorSets(
871 VkDevice device,
872 uint32_t writeCount,
873 const VkWriteDescriptorSet* pDescriptorWrites,
874 uint32_t copyCount,
875 const VkCopyDescriptorSet* pDescriptorCopies)
Chia-I Wuf8385062015-01-04 16:27:24 +0800876{
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800877 uint32_t i, j;
Chia-I Wuf8385062015-01-04 16:27:24 +0800878
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800879 for (i = 0; i < writeCount; i++) {
880 const VkWriteDescriptorSet *write = &pDescriptorWrites[i];
881 struct intel_desc_set *set = intel_desc_set(write->destSet);
882 const struct intel_desc_layout_binding *binding;
883 struct intel_desc_iter iter;
Chia-I Wuf8385062015-01-04 16:27:24 +0800884
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800885 if (!desc_iter_init_for_writing(&iter, set, write->destBinding,
886 write->destArrayElement) ||
887 iter.type != write->descriptorType)
888 return VK_ERROR_INVALID_VALUE;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800889
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800890 switch (write->descriptorType) {
891 case VK_DESCRIPTOR_TYPE_SAMPLER:
892 for (j = 0; j < write->count; j++) {
893 const VkDescriptorInfo *info = &write->pDescriptors[j];
894 const struct intel_sampler *sampler =
895 intel_sampler(info->sampler);
896
897 desc_set_write_sampler(set, &iter, sampler);
898
899 if (!intel_desc_iter_advance(&iter))
900 return VK_ERROR_INVALID_VALUE;
901 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800902 break;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800903 case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
904 binding = &set->layout->bindings[write->destBinding];
905
906 /* write the shared immutable sampler */
907 if (binding->shared_immutable_sampler) {
908 struct intel_desc_offset end;
909 struct intel_desc_sampler sampler_desc;
910
911 assert(!iter.increment.sampler);
912 intel_desc_offset_set(&end, iter.begin.surface,
913 iter.begin.sampler + set->region->sampler_desc_size);
914
915 sampler_desc.sampler = binding->shared_immutable_sampler;
916 intel_desc_region_update(set->region, &iter.begin, &end,
917 NULL, &sampler_desc);
918 }
919
920 for (j = 0; j < write->count; j++) {
921 const VkDescriptorInfo *info = &write->pDescriptors[j];
922 const struct intel_img_view *img_view =
923 intel_img_view(info->imageView);
924 const struct intel_sampler *sampler =
925 (binding->immutable_samplers) ?
926 binding->immutable_samplers[write->destArrayElement + j] :
927 intel_sampler(info->sampler);
928
929 desc_set_write_combined_image_sampler(set, &iter,
930 img_view, info->imageLayout, sampler);
931
932 if (!intel_desc_iter_advance(&iter))
933 return VK_ERROR_INVALID_VALUE;
934 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800935 break;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800936 case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
937 case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
938 for (j = 0; j < write->count; j++) {
939 const VkDescriptorInfo *info = &write->pDescriptors[j];
940 const struct intel_img_view *img_view =
941 intel_img_view(info->imageView);
942
943 desc_set_write_image(set, &iter, img_view, info->imageLayout);
944
945 if (!intel_desc_iter_advance(&iter))
946 return VK_ERROR_INVALID_VALUE;
947 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800948 break;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800949 case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
950 case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
951 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
952 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
953 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
954 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
955 for (j = 0; j < write->count; j++) {
956 const VkDescriptorInfo *info = &write->pDescriptors[j];
957 const struct intel_buf_view *buf_view =
958 intel_buf_view(info->bufferView);
959
960 desc_set_write_buffer(set, &iter, buf_view);
961
962 if (!intel_desc_iter_advance(&iter))
963 return VK_ERROR_INVALID_VALUE;
964 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800965 break;
966 default:
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800967 return VK_ERROR_INVALID_VALUE;
Chia-I Wuf8385062015-01-04 16:27:24 +0800968 break;
969 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800970 }
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800971
972 for (i = 0; i < copyCount; i++) {
973 const VkCopyDescriptorSet *copy = &pDescriptorCopies[i];
974 const struct intel_desc_set *src_set = intel_desc_set(copy->srcSet);
975 const struct intel_desc_set *dst_set = intel_desc_set(copy->destSet);
976 struct intel_desc_iter src_iter, dst_iter;
977 struct intel_desc_offset src_begin, dst_begin;
978
979 if (!desc_iter_init_for_writing(&src_iter, src_set,
980 copy->srcBinding, copy->srcArrayElement) ||
981 !desc_iter_init_for_writing(&dst_iter, dst_set,
982 copy->destBinding, copy->destArrayElement) ||
983 src_iter.type != dst_iter.type)
984 return VK_ERROR_INVALID_VALUE;
985
986 /* disallow combined image samplers */
987 if (dst_iter.type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
988 return VK_ERROR_UNKNOWN;
989
990 /* save the begin offsets */
991 src_begin = src_iter.begin;
992 dst_begin = dst_iter.begin;
993
994 /* advance to the end */
995 for (j = 0; j < copy->count; j++) {
996 if (!intel_desc_iter_advance(&src_iter) ||
997 !intel_desc_iter_advance(&dst_iter))
998 return VK_ERROR_INVALID_VALUE;
999 }
1000
1001 intel_desc_region_copy(dst_set->region, &dst_begin,
1002 &dst_iter.end, &src_begin);
1003 }
1004
1005 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +08001006}