blob: 81abcef452598c73f32ecbcd26eda0fafb9d7c88 [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;
Courtney Goeltzenleuchter2a3e3a32015-09-11 15:29:21 -060050 const struct intel_buf_view buf;
Chia-I Wuf8385062015-01-04 16:27:24 +080051 const struct intel_img_view *img;
52 } u;
53};
54
55struct intel_desc_sampler {
56 const struct intel_sampler *sampler;
57};
58
Chia-I Wu7732cb22015-03-26 15:27:55 +080059bool intel_desc_iter_init_for_binding(struct intel_desc_iter *iter,
60 const struct intel_desc_layout *layout,
61 uint32_t binding_index, uint32_t array_base)
62{
63 const struct intel_desc_layout_binding *binding;
64
65 if (binding_index >= layout->binding_count ||
66 array_base >= layout->bindings[binding_index].array_size)
67 return false;
68
69 binding = &layout->bindings[binding_index];
70
71 iter->type = binding->type;
72 iter->increment = binding->increment;
73 iter->size = binding->array_size;
74
75 intel_desc_offset_mad(&iter->begin, &binding->increment,
76 &binding->offset, array_base);
77 intel_desc_offset_add(&iter->end, &iter->begin, &binding->increment);
78 iter->cur = array_base;
79
80 return true;
81}
82
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +080083static bool desc_iter_init_for_writing(struct intel_desc_iter *iter,
84 const struct intel_desc_set *set,
85 uint32_t binding_index, uint32_t array_base)
Chia-I Wu7732cb22015-03-26 15:27:55 +080086{
87 if (!intel_desc_iter_init_for_binding(iter, set->layout,
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +080088 binding_index, array_base))
Chia-I Wu7732cb22015-03-26 15:27:55 +080089 return false;
90
91 intel_desc_offset_add(&iter->begin, &iter->begin, &set->region_begin);
92 intel_desc_offset_add(&iter->end, &iter->end, &set->region_begin);
93
94 return true;
95}
96
97bool intel_desc_iter_advance(struct intel_desc_iter *iter)
98{
99 if (iter->cur >= iter->size)
100 return false;
101
102 iter->cur++;
103
104 iter->begin = iter->end;
105 intel_desc_offset_add(&iter->end, &iter->end, &iter->increment);
106
107 return true;
108}
109
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800110static bool desc_region_init_desc_sizes(struct intel_desc_region *region,
111 const struct intel_gpu *gpu)
Chia-I Wuf8385062015-01-04 16:27:24 +0800112{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800113 region->surface_desc_size = sizeof(struct intel_desc_surface);
114 region->sampler_desc_size = sizeof(struct intel_desc_sampler);
Chia-I Wuf8385062015-01-04 16:27:24 +0800115
116 return true;
117}
118
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600119VkResult intel_desc_region_create(struct intel_dev *dev,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800120 struct intel_desc_region **region_ret)
Chia-I Wuf8385062015-01-04 16:27:24 +0800121{
Mike Stroyanaaabdcc2015-07-28 10:55:29 -0600122 const uint32_t surface_count = 1024*1024;
123 const uint32_t sampler_count = 1024*1024;
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800124 struct intel_desc_region *region;
Chia-I Wuf8385062015-01-04 16:27:24 +0800125
Tony Barbour8205d902015-04-16 15:59:00 -0600126 region = intel_alloc(dev, sizeof(*region), 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800127 if (!region)
Tony Barbour8205d902015-04-16 15:59:00 -0600128 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800129
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800130 memset(region, 0, sizeof(*region));
Chia-I Wuf8385062015-01-04 16:27:24 +0800131
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800132 if (!desc_region_init_desc_sizes(region, dev->gpu)) {
133 intel_free(dev, region);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600134 return VK_ERROR_UNKNOWN;
Chia-I Wuf8385062015-01-04 16:27:24 +0800135 }
136
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800137 intel_desc_offset_set(&region->size,
138 region->surface_desc_size * surface_count,
139 region->sampler_desc_size * sampler_count);
Chia-I Wuf8385062015-01-04 16:27:24 +0800140
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800141 region->surfaces = intel_alloc(dev, region->size.surface,
Tony Barbour8205d902015-04-16 15:59:00 -0600142 64, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800143 if (!region->surfaces) {
144 intel_free(dev, region);
Tony Barbour8205d902015-04-16 15:59:00 -0600145 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800146 }
147
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800148 region->samplers = intel_alloc(dev, region->size.sampler,
Tony Barbour8205d902015-04-16 15:59:00 -0600149 64, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800150 if (!region->samplers) {
151 intel_free(dev, region->surfaces);
152 intel_free(dev, region);
Tony Barbour8205d902015-04-16 15:59:00 -0600153 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800154 }
155
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800156 *region_ret = region;
Chia-I Wuf8385062015-01-04 16:27:24 +0800157
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600158 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800159}
160
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800161void intel_desc_region_destroy(struct intel_dev *dev,
162 struct intel_desc_region *region)
Chia-I Wuf8385062015-01-04 16:27:24 +0800163{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800164 intel_free(dev, region->samplers);
165 intel_free(dev, region->surfaces);
166 intel_free(dev, region);
Chia-I Wuf8385062015-01-04 16:27:24 +0800167}
168
169/**
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800170 * Get the size of a descriptor in the region.
Chia-I Wuf8385062015-01-04 16:27:24 +0800171 */
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600172static VkResult desc_region_get_desc_size(const struct intel_desc_region *region,
173 VkDescriptorType type,
Chia-I Wuf8385062015-01-04 16:27:24 +0800174 struct intel_desc_offset *size)
175{
176 uint32_t surface_size = 0, sampler_size = 0;
177
178 switch (type) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600179 case VK_DESCRIPTOR_TYPE_SAMPLER:
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800180 sampler_size = region->sampler_desc_size;
Chia-I Wuf8385062015-01-04 16:27:24 +0800181 break;
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600182 case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800183 surface_size = region->surface_desc_size;
184 sampler_size = region->sampler_desc_size;
Chia-I Wuf8385062015-01-04 16:27:24 +0800185 break;
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600186 case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
187 case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
188 case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
189 case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600190 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600191 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600192 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600193 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800194 surface_size = region->surface_desc_size;
Chia-I Wuf8385062015-01-04 16:27:24 +0800195 break;
196 default:
197 assert(!"unknown descriptor type");
Chia-I Wuf8385062015-01-04 16:27:24 +0800198 break;
199 }
200
201 intel_desc_offset_set(size, surface_size, sampler_size);
202
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600203 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800204}
205
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600206VkResult intel_desc_region_alloc(struct intel_desc_region *region,
Norbert Nopper4077e7a2015-08-15 15:07:38 +0200207 uint32_t max_sets,
208 const VkDescriptorPoolCreateInfo *info,
209 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
Norbert Nopper4077e7a2015-08-15 15:07:38 +0200230 surface_size *= max_sets;
231 sampler_size *= max_sets;
232
Chia-I Wuf8385062015-01-04 16:27:24 +0800233 intel_desc_offset_set(&alloc, surface_size, sampler_size);
234
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800235 *begin = region->cur;
236 intel_desc_offset_add(end, &region->cur, &alloc);
Chia-I Wuf8385062015-01-04 16:27:24 +0800237
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800238 if (!intel_desc_offset_within(end, &region->size))
Tony Barbour8205d902015-04-16 15:59:00 -0600239 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800240
241 /* increment the writer pointer */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800242 region->cur = *end;
Chia-I Wuf8385062015-01-04 16:27:24 +0800243
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600244 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800245}
246
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800247static void desc_region_validate_begin_end(const struct intel_desc_region *region,
248 const struct intel_desc_offset *begin,
249 const struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800250{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800251 assert(begin->surface % region->surface_desc_size == 0 &&
252 begin->sampler % region->sampler_desc_size == 0);
253 assert(end->surface % region->surface_desc_size == 0 &&
254 end->sampler % region->sampler_desc_size == 0);
255 assert(intel_desc_offset_within(end, &region->size));
Chia-I Wuf8385062015-01-04 16:27:24 +0800256}
257
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800258void intel_desc_region_free(struct intel_desc_region *region,
259 const struct intel_desc_offset *begin,
260 const struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800261{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800262 desc_region_validate_begin_end(region, begin, end);
Chia-I Wuf8385062015-01-04 16:27:24 +0800263
264 /* is it ok not to reclaim? */
265}
266
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800267void intel_desc_region_update(struct intel_desc_region *region,
268 const struct intel_desc_offset *begin,
269 const struct intel_desc_offset *end,
270 const struct intel_desc_surface *surfaces,
271 const struct intel_desc_sampler *samplers)
Chia-I Wuf8385062015-01-04 16:27:24 +0800272{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800273 desc_region_validate_begin_end(region, begin, end);
Chia-I Wuf8385062015-01-04 16:27:24 +0800274
275 if (begin->surface < end->surface) {
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800276 memcpy((char *) region->surfaces + begin->surface, surfaces,
Chia-I Wuf8385062015-01-04 16:27:24 +0800277 end->surface - begin->surface);
278 }
279
280 if (begin->sampler < end->sampler) {
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800281 memcpy((char *) region->samplers + begin->sampler, samplers,
Chia-I Wuf8385062015-01-04 16:27:24 +0800282 end->sampler - begin->sampler);
283 }
284}
285
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800286void intel_desc_region_copy(struct intel_desc_region *region,
287 const struct intel_desc_offset *begin,
288 const struct intel_desc_offset *end,
289 const struct intel_desc_offset *src)
Chia-I Wuf8385062015-01-04 16:27:24 +0800290{
291 struct intel_desc_offset src_end;
292 const struct intel_desc_surface *surfaces;
293 const struct intel_desc_sampler *samplers;
294
295 /* no overlap */
296 assert(intel_desc_offset_within(src, begin) ||
297 intel_desc_offset_within(end, src));
298
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800299 /* no read past region */
Chia-I Wuf8385062015-01-04 16:27:24 +0800300 intel_desc_offset_sub(&src_end, end, begin);
301 intel_desc_offset_add(&src_end, src, &src_end);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800302 assert(intel_desc_offset_within(&src_end, &region->size));
Chia-I Wuf8385062015-01-04 16:27:24 +0800303
304 surfaces = (const struct intel_desc_surface *)
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800305 ((const char *) region->surfaces + src->surface);
Tony Barbour379e0a72015-02-05 11:09:34 -0700306 samplers = (const struct intel_desc_sampler *)
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800307 ((const char *) region->samplers + src->sampler);
Chia-I Wuf8385062015-01-04 16:27:24 +0800308
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800309 intel_desc_region_update(region, begin, end, surfaces, samplers);
Chia-I Wuf8385062015-01-04 16:27:24 +0800310}
311
Chia-I Wu862c5572015-03-28 15:23:55 +0800312void intel_desc_region_read_surface(const struct intel_desc_region *region,
313 const struct intel_desc_offset *offset,
Tony Barbour8205d902015-04-16 15:59:00 -0600314 VkShaderStage stage,
Chia-I Wu862c5572015-03-28 15:23:55 +0800315 const struct intel_mem **mem,
316 bool *read_only,
317 const uint32_t **cmd,
318 uint32_t *cmd_len)
319{
320 const struct intel_desc_surface *desc;
321 struct intel_desc_offset end;
322
323 intel_desc_offset_set(&end,
324 offset->surface + region->surface_desc_size, offset->sampler);
325 desc_region_validate_begin_end(region, offset, &end);
326
327 desc = (const struct intel_desc_surface *)
328 ((const char *) region->surfaces + offset->surface);
329
330 *mem = desc->mem;
331 *read_only = desc->read_only;
332 switch (desc->type) {
333 case INTEL_DESC_SURFACE_BUF:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600334 *cmd = (stage == VK_SHADER_STAGE_FRAGMENT) ?
Courtney Goeltzenleuchter2a3e3a32015-09-11 15:29:21 -0600335 desc->u.buf.fs_cmd : desc->u.buf.cmd;
336 *cmd_len = desc->u.buf.cmd_len;
Chia-I Wu862c5572015-03-28 15:23:55 +0800337 break;
338 case INTEL_DESC_SURFACE_IMG:
339 *cmd = desc->u.img->cmd;
340 *cmd_len = desc->u.img->cmd_len;
341 break;
342 case INTEL_DESC_SURFACE_UNUSED:
343 default:
344 *cmd = NULL;
345 *cmd_len = 0;
346 break;
347 }
348}
349
350void intel_desc_region_read_sampler(const struct intel_desc_region *region,
351 const struct intel_desc_offset *offset,
352 const struct intel_sampler **sampler)
353{
354 const struct intel_desc_sampler *desc;
355 struct intel_desc_offset end;
356
357 intel_desc_offset_set(&end,
358 offset->surface, offset->sampler + region->sampler_desc_size);
359 desc_region_validate_begin_end(region, offset, &end);
360
361 desc = (const struct intel_desc_sampler *)
362 ((const char *) region->samplers + offset->sampler);
363
364 *sampler = desc->sampler;
365}
366
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800367static void desc_pool_destroy(struct intel_obj *obj)
Chia-I Wuf8385062015-01-04 16:27:24 +0800368{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800369 struct intel_desc_pool *pool = intel_desc_pool_from_obj(obj);
Chia-I Wuf8385062015-01-04 16:27:24 +0800370
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800371 intel_desc_pool_destroy(pool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800372}
373
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600374VkResult intel_desc_pool_create(struct intel_dev *dev,
375 VkDescriptorPoolUsage usage,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800376 uint32_t max_sets,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600377 const VkDescriptorPoolCreateInfo *info,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800378 struct intel_desc_pool **pool_ret)
Chia-I Wuf8385062015-01-04 16:27:24 +0800379{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800380 struct intel_desc_pool *pool;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600381 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800382
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800383 pool = (struct intel_desc_pool *) intel_base_create(&dev->base.handle,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600384 sizeof(*pool), dev->base.dbg, VK_OBJECT_TYPE_DESCRIPTOR_POOL,
Chia-I Wu545c2e12015-02-22 13:19:54 +0800385 info, 0);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800386 if (!pool)
Tony Barbour8205d902015-04-16 15:59:00 -0600387 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800388
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800389 pool->dev = dev;
Chia-I Wuf8385062015-01-04 16:27:24 +0800390
Norbert Nopper4077e7a2015-08-15 15:07:38 +0200391 ret = intel_desc_region_alloc(dev->desc_region, max_sets, info,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800392 &pool->region_begin, &pool->region_end);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600393 if (ret != VK_SUCCESS) {
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800394 intel_base_destroy(&pool->obj.base);
Chia-I Wuf8385062015-01-04 16:27:24 +0800395 return ret;
396 }
397
398 /* point to head */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800399 pool->cur = pool->region_begin;
Chia-I Wuf8385062015-01-04 16:27:24 +0800400
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800401 pool->obj.destroy = desc_pool_destroy;
Chia-I Wuf8385062015-01-04 16:27:24 +0800402
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800403 *pool_ret = pool;
Chia-I Wuf8385062015-01-04 16:27:24 +0800404
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600405 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800406}
407
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800408void intel_desc_pool_destroy(struct intel_desc_pool *pool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800409{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800410 intel_desc_region_free(pool->dev->desc_region,
411 &pool->region_begin, &pool->region_end);
412 intel_base_destroy(&pool->obj.base);
Chia-I Wuf8385062015-01-04 16:27:24 +0800413}
414
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600415VkResult intel_desc_pool_alloc(struct intel_desc_pool *pool,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800416 const struct intel_desc_layout *layout,
417 struct intel_desc_offset *begin,
418 struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800419{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800420 *begin = pool->cur;
421 intel_desc_offset_add(end, &pool->cur, &layout->region_size);
Chia-I Wuf8385062015-01-04 16:27:24 +0800422
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800423 if (!intel_desc_offset_within(end, &pool->region_end))
Tony Barbour8205d902015-04-16 15:59:00 -0600424 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800425
426 /* increment the writer pointer */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800427 pool->cur = *end;
Chia-I Wuf8385062015-01-04 16:27:24 +0800428
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600429 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800430}
431
Chia-I Wudee95612015-03-26 15:23:52 +0800432void intel_desc_pool_reset(struct intel_desc_pool *pool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800433{
434 /* reset to head */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800435 pool->cur = pool->region_begin;
Chia-I Wuf8385062015-01-04 16:27:24 +0800436}
437
438static void desc_set_destroy(struct intel_obj *obj)
439{
440 struct intel_desc_set *set = intel_desc_set_from_obj(obj);
441
442 intel_desc_set_destroy(set);
443}
444
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600445VkResult intel_desc_set_create(struct intel_dev *dev,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800446 struct intel_desc_pool *pool,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600447 VkDescriptorSetUsage usage,
Chia-I Wuf8385062015-01-04 16:27:24 +0800448 const struct intel_desc_layout *layout,
449 struct intel_desc_set **set_ret)
450{
451 struct intel_desc_set *set;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600452 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800453
Chia-I Wu545c2e12015-02-22 13:19:54 +0800454 set = (struct intel_desc_set *) intel_base_create(&dev->base.handle,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600455 sizeof(*set), dev->base.dbg, VK_OBJECT_TYPE_DESCRIPTOR_SET,
Chia-I Wu545c2e12015-02-22 13:19:54 +0800456 NULL, 0);
Chia-I Wuf8385062015-01-04 16:27:24 +0800457 if (!set)
Tony Barbour8205d902015-04-16 15:59:00 -0600458 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800459
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800460 set->region = dev->desc_region;
461 ret = intel_desc_pool_alloc(pool, layout,
462 &set->region_begin, &set->region_end);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600463 if (ret != VK_SUCCESS) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800464 intel_base_destroy(&set->obj.base);
465 return ret;
466 }
467
468 set->layout = layout;
469
470 set->obj.destroy = desc_set_destroy;
471
472 *set_ret = set;
473
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600474 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800475}
476
477void intel_desc_set_destroy(struct intel_desc_set *set)
478{
479 intel_base_destroy(&set->obj.base);
480}
481
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600482static bool desc_set_img_layout_read_only(VkImageLayout layout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800483{
484 switch (layout) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600485 case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
486 case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
487 case VK_IMAGE_LAYOUT_TRANSFER_SOURCE_OPTIMAL:
Chia-I Wuf8385062015-01-04 16:27:24 +0800488 return true;
489 default:
490 return false;
491 }
492}
493
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800494static void desc_set_write_sampler(struct intel_desc_set *set,
495 const struct intel_desc_iter *iter,
496 const struct intel_sampler *sampler)
Chia-I Wuf8385062015-01-04 16:27:24 +0800497{
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800498 struct intel_desc_sampler desc;
Chia-I Wuf8385062015-01-04 16:27:24 +0800499
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800500 desc.sampler = sampler;
501 intel_desc_region_update(set->region, &iter->begin, &iter->end,
502 NULL, &desc);
Chia-I Wuf8385062015-01-04 16:27:24 +0800503}
504
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800505static void desc_set_write_combined_image_sampler(struct intel_desc_set *set,
506 const struct intel_desc_iter *iter,
507 const struct intel_img_view *img_view,
508 VkImageLayout img_layout,
509 const struct intel_sampler *sampler)
Chia-I Wuf8385062015-01-04 16:27:24 +0800510{
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800511 struct intel_desc_surface view_desc;
512 struct intel_desc_sampler sampler_desc;
Chia-I Wuf8385062015-01-04 16:27:24 +0800513
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800514 view_desc.mem = img_view->img->obj.mem;
515 view_desc.read_only = desc_set_img_layout_read_only(img_layout);
516 view_desc.type = INTEL_DESC_SURFACE_IMG;
517 view_desc.u.img = img_view;
Chia-I Wuf8385062015-01-04 16:27:24 +0800518
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800519 sampler_desc.sampler = sampler;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800520
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800521 intel_desc_region_update(set->region, &iter->begin, &iter->end,
522 &view_desc, &sampler_desc);
Chia-I Wuf8385062015-01-04 16:27:24 +0800523}
524
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800525static void desc_set_write_image(struct intel_desc_set *set,
526 const struct intel_desc_iter *iter,
527 const struct intel_img_view *img_view,
528 VkImageLayout img_layout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800529{
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800530 struct intel_desc_surface desc;
Chia-I Wuf8385062015-01-04 16:27:24 +0800531
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800532 desc.mem = img_view->img->obj.mem;
533 desc.read_only = desc_set_img_layout_read_only(img_layout);
534 desc.type = INTEL_DESC_SURFACE_IMG;
535 desc.u.img = img_view;
536 intel_desc_region_update(set->region, &iter->begin, &iter->end,
537 &desc, NULL);
Chia-I Wuf8385062015-01-04 16:27:24 +0800538}
539
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800540static void desc_set_write_buffer(struct intel_desc_set *set,
541 const struct intel_desc_iter *iter,
542 const struct intel_buf_view *buf_view)
Chia-I Wuf8385062015-01-04 16:27:24 +0800543{
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800544 struct intel_desc_surface desc;
Chia-I Wuf8385062015-01-04 16:27:24 +0800545
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800546 desc.mem = buf_view->buf->obj.mem;
547 desc.read_only = false;
548 desc.type = INTEL_DESC_SURFACE_BUF;
Courtney Goeltzenleuchter2a3e3a32015-09-11 15:29:21 -0600549 memcpy(&desc.u.buf, buf_view, sizeof(*buf_view));
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800550 intel_desc_region_update(set->region, &iter->begin, &iter->end,
551 &desc, NULL);
Chia-I Wuf8385062015-01-04 16:27:24 +0800552}
553
554static void desc_layout_destroy(struct intel_obj *obj)
555{
556 struct intel_desc_layout *layout = intel_desc_layout_from_obj(obj);
557
558 intel_desc_layout_destroy(layout);
559}
560
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600561static VkResult desc_layout_init_bindings(struct intel_desc_layout *layout,
Chia-I Wufc9d9132015-03-26 15:04:41 +0800562 const struct intel_desc_region *region,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600563 const VkDescriptorSetLayoutCreateInfo *info)
Chia-I Wuf8385062015-01-04 16:27:24 +0800564{
565 struct intel_desc_offset offset;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800566 uint32_t i;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600567 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800568
Chia-I Wu7732cb22015-03-26 15:27:55 +0800569 intel_desc_offset_set(&offset, 0, 0);
Chia-I Wuf8385062015-01-04 16:27:24 +0800570
Chia-I Wufc9d9132015-03-26 15:04:41 +0800571 /* allocate bindings */
572 layout->bindings = intel_alloc(layout, sizeof(layout->bindings[0]) *
Tony Barbour8205d902015-04-16 15:59:00 -0600573 info->count, 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wufc9d9132015-03-26 15:04:41 +0800574 if (!layout->bindings)
Tony Barbour8205d902015-04-16 15:59:00 -0600575 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wufc9d9132015-03-26 15:04:41 +0800576
577 memset(layout->bindings, 0, sizeof(layout->bindings[0]) * info->count);
578 layout->binding_count = info->count;
579
580 /* initialize bindings */
581 for (i = 0; i < info->count; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600582 const VkDescriptorSetLayoutBinding *lb = &info->pBinding[i];
Chia-I Wufc9d9132015-03-26 15:04:41 +0800583 struct intel_desc_layout_binding *binding = &layout->bindings[i];
Chia-I Wuf8385062015-01-04 16:27:24 +0800584 struct intel_desc_offset size;
585
Chia-I Wufc9d9132015-03-26 15:04:41 +0800586 switch (lb->descriptorType) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600587 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600588 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
Chia-I Wud3114a22015-05-25 16:22:52 +0800589 layout->dynamic_desc_count += lb->arraySize;
Chia-I Wufc9d9132015-03-26 15:04:41 +0800590 break;
591 default:
592 break;
593 }
594
Chia-I Wu7732cb22015-03-26 15:27:55 +0800595 /* lb->stageFlags does not gain us anything */
596 binding->type = lb->descriptorType;
Chia-I Wud3114a22015-05-25 16:22:52 +0800597 binding->array_size = lb->arraySize;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800598 binding->offset = offset;
599
Chia-I Wufc9d9132015-03-26 15:04:41 +0800600 ret = desc_region_get_desc_size(region,
601 lb->descriptorType, &size);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600602 if (ret != VK_SUCCESS)
Chia-I Wuf8385062015-01-04 16:27:24 +0800603 return ret;
604
Chia-I Wu310eece2015-03-27 12:56:09 +0800605 binding->increment = size;
606
607 /* copy immutable samplers */
608 if (lb->pImmutableSamplers) {
609 bool shared = true;
610 uint32_t j;
611
Chia-I Wud3114a22015-05-25 16:22:52 +0800612 for (j = 1; j < lb->arraySize; j++) {
Tony Barbourde4124d2015-07-03 10:33:54 -0600613 if (lb->pImmutableSamplers[j].handle != lb->pImmutableSamplers[0].handle) {
Chia-I Wu310eece2015-03-27 12:56:09 +0800614 shared = false;
615 break;
616 }
617 }
618
619 if (shared) {
620 binding->shared_immutable_sampler =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600621 intel_sampler((VkSampler) lb->pImmutableSamplers[0]);
Chia-I Wu310eece2015-03-27 12:56:09 +0800622 /* set sampler offset increment to 0 */
623 intel_desc_offset_set(&binding->increment,
624 binding->increment.surface, 0);
625 } else {
626 binding->immutable_samplers = intel_alloc(layout,
Chia-I Wud3114a22015-05-25 16:22:52 +0800627 sizeof(binding->immutable_samplers[0]) * lb->arraySize,
Tony Barbour8205d902015-04-16 15:59:00 -0600628 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu310eece2015-03-27 12:56:09 +0800629 if (!binding->immutable_samplers)
Tony Barbour8205d902015-04-16 15:59:00 -0600630 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wu310eece2015-03-27 12:56:09 +0800631
Chia-I Wud3114a22015-05-25 16:22:52 +0800632 for (j = 0; j < lb->arraySize; j++) {
Chia-I Wu310eece2015-03-27 12:56:09 +0800633 binding->immutable_samplers[j] =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600634 intel_sampler((VkSampler) lb->pImmutableSamplers[j]);
Chia-I Wu310eece2015-03-27 12:56:09 +0800635 }
636 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800637 }
638
Chia-I Wu7732cb22015-03-26 15:27:55 +0800639 /* increment offset */
Chia-I Wufc9d9132015-03-26 15:04:41 +0800640 intel_desc_offset_mad(&size, &binding->increment, &size,
Chia-I Wud3114a22015-05-25 16:22:52 +0800641 lb->arraySize - 1);
Chia-I Wuf8385062015-01-04 16:27:24 +0800642 intel_desc_offset_add(&offset, &offset, &size);
Chia-I Wuf8385062015-01-04 16:27:24 +0800643 }
644
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800645 layout->region_size = offset;
Chia-I Wuf8385062015-01-04 16:27:24 +0800646
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600647 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800648}
649
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600650VkResult intel_desc_layout_create(struct intel_dev *dev,
651 const VkDescriptorSetLayoutCreateInfo *info,
Chia-I Wuf8385062015-01-04 16:27:24 +0800652 struct intel_desc_layout **layout_ret)
653{
654 struct intel_desc_layout *layout;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600655 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800656
Chia-I Wu545c2e12015-02-22 13:19:54 +0800657 layout = (struct intel_desc_layout *) intel_base_create(&dev->base.handle,
658 sizeof(*layout), dev->base.dbg,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600659 VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, info, 0);
Chia-I Wuf8385062015-01-04 16:27:24 +0800660 if (!layout)
Tony Barbour8205d902015-04-16 15:59:00 -0600661 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800662
Chia-I Wu7732cb22015-03-26 15:27:55 +0800663 ret = desc_layout_init_bindings(layout, dev->desc_region, info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600664 if (ret != VK_SUCCESS) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800665 intel_desc_layout_destroy(layout);
666 return ret;
667 }
668
669 layout->obj.destroy = desc_layout_destroy;
670
671 *layout_ret = layout;
672
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600673 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800674}
675
676void intel_desc_layout_destroy(struct intel_desc_layout *layout)
677{
Chia-I Wu310eece2015-03-27 12:56:09 +0800678 uint32_t i;
679
680 for (i = 0; i < layout->binding_count; i++) {
681 struct intel_desc_layout_binding *binding = &layout->bindings[i];
682
683 if (binding->immutable_samplers)
684 intel_free(layout, binding->immutable_samplers);
685 }
Chia-I Wufc9d9132015-03-26 15:04:41 +0800686 intel_free(layout, layout->bindings);
Chia-I Wuf8385062015-01-04 16:27:24 +0800687 intel_base_destroy(&layout->obj.base);
688}
689
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500690static void pipeline_layout_destroy(struct intel_obj *obj)
Chia-I Wuf8385062015-01-04 16:27:24 +0800691{
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500692 struct intel_pipeline_layout *pipeline_layout =
693 intel_pipeline_layout_from_obj(obj);
Chia-I Wuf8385062015-01-04 16:27:24 +0800694
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500695 intel_pipeline_layout_destroy(pipeline_layout);
Chia-I Wuf8385062015-01-04 16:27:24 +0800696}
697
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500698VkResult intel_pipeline_layout_create(struct intel_dev *dev,
699 const VkPipelineLayoutCreateInfo *pPipelineCreateInfo,
700 struct intel_pipeline_layout **pipeline_layout_ret)
Chia-I Wuf8385062015-01-04 16:27:24 +0800701{
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500702 struct intel_pipeline_layout *pipeline_layout;
703 uint32_t count = pPipelineCreateInfo->descriptorSetCount;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800704 uint32_t i;
705
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500706 pipeline_layout = (struct intel_pipeline_layout *) intel_base_create(
707 &dev->base.handle, sizeof(*pipeline_layout), dev->base.dbg,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600708 VK_OBJECT_TYPE_PIPELINE_LAYOUT, NULL, 0);
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500709
710 if (!pipeline_layout)
Tony Barbour8205d902015-04-16 15:59:00 -0600711 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800712
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500713 pipeline_layout->layouts = intel_alloc(pipeline_layout,
714 sizeof(pipeline_layout->layouts[0]) * count,
715 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
716 if (!pipeline_layout->layouts) {
717 intel_pipeline_layout_destroy(pipeline_layout);
Tony Barbour8205d902015-04-16 15:59:00 -0600718 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800719 }
720
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500721 pipeline_layout->dynamic_desc_indices = intel_alloc(pipeline_layout,
722 sizeof(pipeline_layout->dynamic_desc_indices[0]) * count,
Tony Barbour8205d902015-04-16 15:59:00 -0600723 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500724 if (!pipeline_layout->dynamic_desc_indices) {
725 intel_pipeline_layout_destroy(pipeline_layout);
Tony Barbour8205d902015-04-16 15:59:00 -0600726 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wu862c5572015-03-28 15:23:55 +0800727 }
728
729 for (i = 0; i < count; i++) {
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500730 pipeline_layout->layouts[i] = intel_desc_layout(pPipelineCreateInfo->pSetLayouts[i]);
731 pipeline_layout->dynamic_desc_indices[i] = pipeline_layout->total_dynamic_desc_count;
Chia-I Wu862c5572015-03-28 15:23:55 +0800732
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500733 pipeline_layout->total_dynamic_desc_count +=
734 pipeline_layout->layouts[i]->dynamic_desc_count;
Chia-I Wu862c5572015-03-28 15:23:55 +0800735 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800736
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500737 pipeline_layout->layout_count = count;
Chia-I Wuf8385062015-01-04 16:27:24 +0800738
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500739 pipeline_layout->obj.destroy = pipeline_layout_destroy;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800740
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500741 *pipeline_layout_ret = pipeline_layout;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800742
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600743 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800744}
745
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500746void intel_pipeline_layout_destroy(struct intel_pipeline_layout *pipeline_layout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800747{
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500748 if (pipeline_layout->dynamic_desc_indices)
749 intel_free(pipeline_layout, pipeline_layout->dynamic_desc_indices);
750 if (pipeline_layout->layouts)
751 intel_free(pipeline_layout, pipeline_layout->layouts);
752 intel_base_destroy(&pipeline_layout->obj.base);
Chia-I Wuf8385062015-01-04 16:27:24 +0800753}
754
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600755ICD_EXPORT VkResult VKAPI vkCreateDescriptorSetLayout(
756 VkDevice device,
757 const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
758 VkDescriptorSetLayout* pSetLayout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800759{
760 struct intel_dev *dev = intel_dev(device);
Chia-I Wuf8385062015-01-04 16:27:24 +0800761
Chia-I Wu7732cb22015-03-26 15:27:55 +0800762 return intel_desc_layout_create(dev, pCreateInfo,
Chia-I Wuf8385062015-01-04 16:27:24 +0800763 (struct intel_desc_layout **) pSetLayout);
764}
765
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600766ICD_EXPORT void VKAPI vkDestroyDescriptorSetLayout(
Tony Barbourde4124d2015-07-03 10:33:54 -0600767 VkDevice device,
768 VkDescriptorSetLayout descriptorSetLayout)
769
770{
771 struct intel_obj *obj = intel_obj(descriptorSetLayout.handle);
772
773 obj->destroy(obj);
Tony Barbourde4124d2015-07-03 10:33:54 -0600774}
775
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500776ICD_EXPORT VkResult VKAPI vkCreatePipelineLayout(
777 VkDevice device,
778 const VkPipelineLayoutCreateInfo* pCreateInfo,
779 VkPipelineLayout* pPipelineLayout)
Chia-I Wu7732cb22015-03-26 15:27:55 +0800780{
781 struct intel_dev *dev = intel_dev(device);
782
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500783 return intel_pipeline_layout_create(dev,
784 pCreateInfo,
785 (struct intel_pipeline_layout **) pPipelineLayout);
Chia-I Wu7732cb22015-03-26 15:27:55 +0800786}
787
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600788ICD_EXPORT void VKAPI vkDestroyPipelineLayout(
Tony Barbourde4124d2015-07-03 10:33:54 -0600789 VkDevice device,
790 VkPipelineLayout pipelineLayout)
791
792{
793 struct intel_obj *obj = intel_obj(pipelineLayout.handle);
794
795 obj->destroy(obj);
Tony Barbourde4124d2015-07-03 10:33:54 -0600796}
797
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600798ICD_EXPORT VkResult VKAPI vkCreateDescriptorPool(
799 VkDevice device,
800 VkDescriptorPoolUsage poolUsage,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600801 uint32_t maxSets,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600802 const VkDescriptorPoolCreateInfo* pCreateInfo,
803 VkDescriptorPool* pDescriptorPool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800804{
805 struct intel_dev *dev = intel_dev(device);
806
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800807 return intel_desc_pool_create(dev, poolUsage, maxSets, pCreateInfo,
808 (struct intel_desc_pool **) pDescriptorPool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800809}
810
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600811ICD_EXPORT void VKAPI vkDestroyDescriptorPool(
Tony Barbourde4124d2015-07-03 10:33:54 -0600812 VkDevice device,
813 VkDescriptorPool descriptorPool)
814
815{
816 struct intel_obj *obj = intel_obj(descriptorPool.handle);
817
818 obj->destroy(obj);
Tony Barbourde4124d2015-07-03 10:33:54 -0600819}
820
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600821ICD_EXPORT VkResult VKAPI vkResetDescriptorPool(
Mike Stroyan230e6252015-04-17 12:36:38 -0600822 VkDevice device,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600823 VkDescriptorPool descriptorPool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800824{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800825 struct intel_desc_pool *pool = intel_desc_pool(descriptorPool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800826
Chia-I Wudee95612015-03-26 15:23:52 +0800827 intel_desc_pool_reset(pool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800828
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600829 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800830}
831
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600832ICD_EXPORT VkResult VKAPI vkAllocDescriptorSets(
Mike Stroyan230e6252015-04-17 12:36:38 -0600833 VkDevice device,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600834 VkDescriptorPool descriptorPool,
835 VkDescriptorSetUsage setUsage,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600836 uint32_t count,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600837 const VkDescriptorSetLayout* pSetLayouts,
Cody Northropc8aa4a52015-08-03 12:47:29 -0600838 VkDescriptorSet* pDescriptorSets)
Chia-I Wuf8385062015-01-04 16:27:24 +0800839{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800840 struct intel_desc_pool *pool = intel_desc_pool(descriptorPool);
841 struct intel_dev *dev = pool->dev;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600842 VkResult ret = VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800843 uint32_t i;
844
845 for (i = 0; i < count; i++) {
846 const struct intel_desc_layout *layout =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600847 intel_desc_layout((VkDescriptorSetLayout) pSetLayouts[i]);
Chia-I Wuf8385062015-01-04 16:27:24 +0800848
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800849 ret = intel_desc_set_create(dev, pool, setUsage, layout,
Chia-I Wuf8385062015-01-04 16:27:24 +0800850 (struct intel_desc_set **) &pDescriptorSets[i]);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600851 if (ret != VK_SUCCESS)
Chia-I Wuf8385062015-01-04 16:27:24 +0800852 break;
853 }
854
Chia-I Wuf8385062015-01-04 16:27:24 +0800855 return ret;
856}
857
Tony Barbourb857d312015-07-10 10:50:45 -0600858ICD_EXPORT VkResult VKAPI vkFreeDescriptorSets(
859 VkDevice device,
860 VkDescriptorPool descriptorPool,
861 uint32_t count,
862 const VkDescriptorSet* pDescriptorSets)
863{
864 uint32_t i;
865
866 for (i = 0; i < count; i++) {
867 intel_desc_set_destroy(
868 *(struct intel_desc_set **) &pDescriptorSets[i]);
869 }
870 return VK_SUCCESS;
871}
872
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600873ICD_EXPORT void VKAPI vkUpdateDescriptorSets(
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800874 VkDevice device,
875 uint32_t writeCount,
876 const VkWriteDescriptorSet* pDescriptorWrites,
877 uint32_t copyCount,
878 const VkCopyDescriptorSet* pDescriptorCopies)
Chia-I Wuf8385062015-01-04 16:27:24 +0800879{
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800880 uint32_t i, j;
Chia-I Wuf8385062015-01-04 16:27:24 +0800881
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800882 for (i = 0; i < writeCount; i++) {
883 const VkWriteDescriptorSet *write = &pDescriptorWrites[i];
884 struct intel_desc_set *set = intel_desc_set(write->destSet);
885 const struct intel_desc_layout_binding *binding;
886 struct intel_desc_iter iter;
Chia-I Wuf8385062015-01-04 16:27:24 +0800887
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800888 if (!desc_iter_init_for_writing(&iter, set, write->destBinding,
889 write->destArrayElement) ||
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600890 iter.type != write->descriptorType) {
891 /* TODOVV: is this covered in validation? */
892// return VK_ERROR_INVALID_VALUE;
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600893// return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600894 }
Chia-I Wu7732cb22015-03-26 15:27:55 +0800895
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800896 switch (write->descriptorType) {
897 case VK_DESCRIPTOR_TYPE_SAMPLER:
898 for (j = 0; j < write->count; j++) {
899 const VkDescriptorInfo *info = &write->pDescriptors[j];
900 const struct intel_sampler *sampler =
901 intel_sampler(info->sampler);
902
903 desc_set_write_sampler(set, &iter, sampler);
904
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600905 if (!intel_desc_iter_advance(&iter)) {
906 /* TODOVV: is this covered in validation? */
907// return VK_ERROR_INVALID_VALUE;
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600908// return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600909 }
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800910 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800911 break;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800912 case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
913 binding = &set->layout->bindings[write->destBinding];
914
915 /* write the shared immutable sampler */
916 if (binding->shared_immutable_sampler) {
917 struct intel_desc_offset end;
918 struct intel_desc_sampler sampler_desc;
919
920 assert(!iter.increment.sampler);
921 intel_desc_offset_set(&end, iter.begin.surface,
922 iter.begin.sampler + set->region->sampler_desc_size);
923
924 sampler_desc.sampler = binding->shared_immutable_sampler;
925 intel_desc_region_update(set->region, &iter.begin, &end,
926 NULL, &sampler_desc);
927 }
928
929 for (j = 0; j < write->count; j++) {
930 const VkDescriptorInfo *info = &write->pDescriptors[j];
931 const struct intel_img_view *img_view =
932 intel_img_view(info->imageView);
933 const struct intel_sampler *sampler =
934 (binding->immutable_samplers) ?
935 binding->immutable_samplers[write->destArrayElement + j] :
936 intel_sampler(info->sampler);
937
938 desc_set_write_combined_image_sampler(set, &iter,
939 img_view, info->imageLayout, sampler);
940
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600941 if (!intel_desc_iter_advance(&iter)) {
942 /* TODOVV: Move test to validation */
943// return VK_ERROR_INVALID_VALUE;
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600944// return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600945 }
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800946 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800947 break;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800948 case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
949 case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
950 for (j = 0; j < write->count; j++) {
951 const VkDescriptorInfo *info = &write->pDescriptors[j];
952 const struct intel_img_view *img_view =
953 intel_img_view(info->imageView);
954
955 desc_set_write_image(set, &iter, img_view, info->imageLayout);
956
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600957 if (!intel_desc_iter_advance(&iter)) {
958 /* TODOVV: Move test to validation */
959// return VK_ERROR_INVALID_VALUE;
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600960// return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600961 }
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800962 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800963 break;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800964 case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
965 case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800966 for (j = 0; j < write->count; j++) {
967 const VkDescriptorInfo *info = &write->pDescriptors[j];
968 const struct intel_buf_view *buf_view =
969 intel_buf_view(info->bufferView);
970
971 desc_set_write_buffer(set, &iter, buf_view);
972
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600973 if (!intel_desc_iter_advance(&iter)) {
974 /* TODOVV: Move test to validation */
975// return VK_ERROR_INVALID_VALUE;
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600976// return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600977 }
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800978 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800979 break;
Courtney Goeltzenleuchter2a3e3a32015-09-11 15:29:21 -0600980 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
981 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
982 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
983 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
984 {
985 const struct intel_dev *dev = intel_dev(device);
986 VkBufferViewCreateInfo view_info;
987 memset(&view_info, 0, sizeof(view_info));
988 view_info.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
989 view_info.viewType = VK_BUFFER_VIEW_TYPE_RAW;
990
991 for (j = 0; j < write->count; j++) {
992 const VkDescriptorInfo *info = &write->pDescriptors[j];
993 struct intel_buf_view buf_view;
994
995 view_info.buffer = info->shaderBuffer.buffer;
996 view_info.offset = info->shaderBuffer.offset;
997 view_info.range = info->shaderBuffer.range;
998
999 intel_buf_view_init(dev, &view_info, &buf_view);
1000
1001 desc_set_write_buffer(set, &iter, &buf_view);
1002
1003 if (!intel_desc_iter_advance(&iter)) {
1004 /* TODOVV: Move test to validation */
1005 // return VK_ERROR_INVALID_VALUE;
1006 // return VK_ERROR_UNKNOWN;
1007 }
1008 }
1009 }
1010 break;
Chia-I Wuf8385062015-01-04 16:27:24 +08001011 default:
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -06001012 /* TODOVV: Make sure validation layer covers this case */
Mark Lobodzinski67b42b72015-09-07 13:59:43 -06001013// return VK_ERROR_UNKNOWN;
Chia-I Wuf8385062015-01-04 16:27:24 +08001014 break;
1015 }
Chia-I Wuf8385062015-01-04 16:27:24 +08001016 }
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001017
1018 for (i = 0; i < copyCount; i++) {
1019 const VkCopyDescriptorSet *copy = &pDescriptorCopies[i];
1020 const struct intel_desc_set *src_set = intel_desc_set(copy->srcSet);
1021 const struct intel_desc_set *dst_set = intel_desc_set(copy->destSet);
1022 struct intel_desc_iter src_iter, dst_iter;
1023 struct intel_desc_offset src_begin, dst_begin;
1024
1025 if (!desc_iter_init_for_writing(&src_iter, src_set,
1026 copy->srcBinding, copy->srcArrayElement) ||
1027 !desc_iter_init_for_writing(&dst_iter, dst_set,
1028 copy->destBinding, copy->destArrayElement) ||
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -06001029 src_iter.type != dst_iter.type) {
1030 /* TODOVV: Move test to validation layer */
1031// return VK_ERROR_INVALID_VALUE;
Mark Lobodzinski67b42b72015-09-07 13:59:43 -06001032// return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -06001033 }
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001034
1035 /* disallow combined image samplers */
Mark Lobodzinski67b42b72015-09-07 13:59:43 -06001036 /* TODOVV: Move test to validation layer */
1037 //if (dst_iter.type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
1038 // return VK_ERROR_UNKNOWN;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001039
1040 /* save the begin offsets */
1041 src_begin = src_iter.begin;
1042 dst_begin = dst_iter.begin;
1043
1044 /* advance to the end */
1045 for (j = 0; j < copy->count; j++) {
1046 if (!intel_desc_iter_advance(&src_iter) ||
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -06001047 !intel_desc_iter_advance(&dst_iter)) {
1048 /* TODOVV: Move test to validation layer */
1049// return VK_ERROR_INVALID_VALUE;
Mark Lobodzinski67b42b72015-09-07 13:59:43 -06001050// return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -06001051 }
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001052 }
1053
1054 intel_desc_region_copy(dst_set->region, &dst_begin,
1055 &dst_iter.end, &src_begin);
1056 }
1057
Mark Lobodzinski67b42b72015-09-07 13:59:43 -06001058// return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +08001059}