blob: b0422f62536d32db97d07820adaf55fe41b50ff9 [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
Courtney Goeltzenleuchterac544f32015-09-14 18:01:17 -0600110static void desc_region_init_desc_sizes(struct intel_desc_region *region,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800111 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
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600117VkResult intel_desc_region_create(struct intel_dev *dev,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800118 struct intel_desc_region **region_ret)
Chia-I Wuf8385062015-01-04 16:27:24 +0800119{
Mike Stroyanaaabdcc2015-07-28 10:55:29 -0600120 const uint32_t surface_count = 1024*1024;
121 const uint32_t sampler_count = 1024*1024;
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800122 struct intel_desc_region *region;
Chia-I Wuf8385062015-01-04 16:27:24 +0800123
Tony Barbour8205d902015-04-16 15:59:00 -0600124 region = intel_alloc(dev, sizeof(*region), 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800125 if (!region)
Tony Barbour8205d902015-04-16 15:59:00 -0600126 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800127
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800128 memset(region, 0, sizeof(*region));
Chia-I Wuf8385062015-01-04 16:27:24 +0800129
Courtney Goeltzenleuchterac544f32015-09-14 18:01:17 -0600130 desc_region_init_desc_sizes(region, dev->gpu);
Chia-I Wuf8385062015-01-04 16:27:24 +0800131
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800132 intel_desc_offset_set(&region->size,
133 region->surface_desc_size * surface_count,
134 region->sampler_desc_size * sampler_count);
Chia-I Wuf8385062015-01-04 16:27:24 +0800135
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800136 region->surfaces = intel_alloc(dev, region->size.surface,
Tony Barbour8205d902015-04-16 15:59:00 -0600137 64, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800138 if (!region->surfaces) {
139 intel_free(dev, region);
Tony Barbour8205d902015-04-16 15:59:00 -0600140 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800141 }
142
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800143 region->samplers = intel_alloc(dev, region->size.sampler,
Tony Barbour8205d902015-04-16 15:59:00 -0600144 64, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800145 if (!region->samplers) {
146 intel_free(dev, region->surfaces);
147 intel_free(dev, region);
Tony Barbour8205d902015-04-16 15:59:00 -0600148 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800149 }
150
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800151 *region_ret = region;
Chia-I Wuf8385062015-01-04 16:27:24 +0800152
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600153 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800154}
155
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800156void intel_desc_region_destroy(struct intel_dev *dev,
157 struct intel_desc_region *region)
Chia-I Wuf8385062015-01-04 16:27:24 +0800158{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800159 intel_free(dev, region->samplers);
160 intel_free(dev, region->surfaces);
161 intel_free(dev, region);
Chia-I Wuf8385062015-01-04 16:27:24 +0800162}
163
164/**
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800165 * Get the size of a descriptor in the region.
Chia-I Wuf8385062015-01-04 16:27:24 +0800166 */
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600167static VkResult desc_region_get_desc_size(const struct intel_desc_region *region,
168 VkDescriptorType type,
Chia-I Wuf8385062015-01-04 16:27:24 +0800169 struct intel_desc_offset *size)
170{
171 uint32_t surface_size = 0, sampler_size = 0;
172
173 switch (type) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600174 case VK_DESCRIPTOR_TYPE_SAMPLER:
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800175 sampler_size = region->sampler_desc_size;
Chia-I Wuf8385062015-01-04 16:27:24 +0800176 break;
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600177 case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800178 surface_size = region->surface_desc_size;
179 sampler_size = region->sampler_desc_size;
Chia-I Wuf8385062015-01-04 16:27:24 +0800180 break;
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600181 case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
182 case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
183 case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
184 case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600185 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600186 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600187 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600188 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800189 surface_size = region->surface_desc_size;
Chia-I Wuf8385062015-01-04 16:27:24 +0800190 break;
191 default:
192 assert(!"unknown descriptor type");
Chia-I Wuf8385062015-01-04 16:27:24 +0800193 break;
194 }
195
196 intel_desc_offset_set(size, surface_size, sampler_size);
197
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600198 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800199}
200
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600201VkResult intel_desc_region_alloc(struct intel_desc_region *region,
Norbert Nopper4077e7a2015-08-15 15:07:38 +0200202 uint32_t max_sets,
203 const VkDescriptorPoolCreateInfo *info,
204 struct intel_desc_offset *begin,
205 struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800206{
207 uint32_t surface_size = 0, sampler_size = 0;
208 struct intel_desc_offset alloc;
209 uint32_t i;
210
211 /* calculate sizes needed */
212 for (i = 0; i < info->count; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600213 const VkDescriptorTypeCount *tc = &info->pTypeCount[i];
Chia-I Wuf8385062015-01-04 16:27:24 +0800214 struct intel_desc_offset size;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600215 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800216
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800217 ret = desc_region_get_desc_size(region, tc->type, &size);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600218 if (ret != VK_SUCCESS)
Chia-I Wuf8385062015-01-04 16:27:24 +0800219 return ret;
220
221 surface_size += size.surface * tc->count;
222 sampler_size += size.sampler * tc->count;
223 }
224
Norbert Nopper4077e7a2015-08-15 15:07:38 +0200225 surface_size *= max_sets;
226 sampler_size *= max_sets;
227
Chia-I Wuf8385062015-01-04 16:27:24 +0800228 intel_desc_offset_set(&alloc, surface_size, sampler_size);
229
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800230 *begin = region->cur;
231 intel_desc_offset_add(end, &region->cur, &alloc);
Chia-I Wuf8385062015-01-04 16:27:24 +0800232
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800233 if (!intel_desc_offset_within(end, &region->size))
Tony Barbour8205d902015-04-16 15:59:00 -0600234 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800235
236 /* increment the writer pointer */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800237 region->cur = *end;
Chia-I Wuf8385062015-01-04 16:27:24 +0800238
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600239 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800240}
241
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800242static void desc_region_validate_begin_end(const struct intel_desc_region *region,
243 const struct intel_desc_offset *begin,
244 const struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800245{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800246 assert(begin->surface % region->surface_desc_size == 0 &&
247 begin->sampler % region->sampler_desc_size == 0);
248 assert(end->surface % region->surface_desc_size == 0 &&
249 end->sampler % region->sampler_desc_size == 0);
250 assert(intel_desc_offset_within(end, &region->size));
Chia-I Wuf8385062015-01-04 16:27:24 +0800251}
252
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800253void intel_desc_region_free(struct intel_desc_region *region,
254 const struct intel_desc_offset *begin,
255 const struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800256{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800257 desc_region_validate_begin_end(region, begin, end);
Chia-I Wuf8385062015-01-04 16:27:24 +0800258
259 /* is it ok not to reclaim? */
260}
261
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800262void intel_desc_region_update(struct intel_desc_region *region,
263 const struct intel_desc_offset *begin,
264 const struct intel_desc_offset *end,
265 const struct intel_desc_surface *surfaces,
266 const struct intel_desc_sampler *samplers)
Chia-I Wuf8385062015-01-04 16:27:24 +0800267{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800268 desc_region_validate_begin_end(region, begin, end);
Chia-I Wuf8385062015-01-04 16:27:24 +0800269
270 if (begin->surface < end->surface) {
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800271 memcpy((char *) region->surfaces + begin->surface, surfaces,
Chia-I Wuf8385062015-01-04 16:27:24 +0800272 end->surface - begin->surface);
273 }
274
275 if (begin->sampler < end->sampler) {
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800276 memcpy((char *) region->samplers + begin->sampler, samplers,
Chia-I Wuf8385062015-01-04 16:27:24 +0800277 end->sampler - begin->sampler);
278 }
279}
280
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800281void intel_desc_region_copy(struct intel_desc_region *region,
282 const struct intel_desc_offset *begin,
283 const struct intel_desc_offset *end,
284 const struct intel_desc_offset *src)
Chia-I Wuf8385062015-01-04 16:27:24 +0800285{
286 struct intel_desc_offset src_end;
287 const struct intel_desc_surface *surfaces;
288 const struct intel_desc_sampler *samplers;
289
290 /* no overlap */
291 assert(intel_desc_offset_within(src, begin) ||
292 intel_desc_offset_within(end, src));
293
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800294 /* no read past region */
Chia-I Wuf8385062015-01-04 16:27:24 +0800295 intel_desc_offset_sub(&src_end, end, begin);
296 intel_desc_offset_add(&src_end, src, &src_end);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800297 assert(intel_desc_offset_within(&src_end, &region->size));
Chia-I Wuf8385062015-01-04 16:27:24 +0800298
299 surfaces = (const struct intel_desc_surface *)
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800300 ((const char *) region->surfaces + src->surface);
Tony Barbour379e0a72015-02-05 11:09:34 -0700301 samplers = (const struct intel_desc_sampler *)
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800302 ((const char *) region->samplers + src->sampler);
Chia-I Wuf8385062015-01-04 16:27:24 +0800303
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800304 intel_desc_region_update(region, begin, end, surfaces, samplers);
Chia-I Wuf8385062015-01-04 16:27:24 +0800305}
306
Chia-I Wu862c5572015-03-28 15:23:55 +0800307void intel_desc_region_read_surface(const struct intel_desc_region *region,
308 const struct intel_desc_offset *offset,
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -0600309 VkShaderStageFlagBits stage,
Chia-I Wu862c5572015-03-28 15:23:55 +0800310 const struct intel_mem **mem,
311 bool *read_only,
312 const uint32_t **cmd,
313 uint32_t *cmd_len)
314{
315 const struct intel_desc_surface *desc;
316 struct intel_desc_offset end;
317
318 intel_desc_offset_set(&end,
319 offset->surface + region->surface_desc_size, offset->sampler);
320 desc_region_validate_begin_end(region, offset, &end);
321
322 desc = (const struct intel_desc_surface *)
323 ((const char *) region->surfaces + offset->surface);
324
325 *mem = desc->mem;
326 *read_only = desc->read_only;
327 switch (desc->type) {
328 case INTEL_DESC_SURFACE_BUF:
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -0600329 *cmd = (stage == VK_SHADER_STAGE_FRAGMENT_BIT) ?
Courtney Goeltzenleuchter2a3e3a32015-09-11 15:29:21 -0600330 desc->u.buf.fs_cmd : desc->u.buf.cmd;
331 *cmd_len = desc->u.buf.cmd_len;
Chia-I Wu862c5572015-03-28 15:23:55 +0800332 break;
333 case INTEL_DESC_SURFACE_IMG:
334 *cmd = desc->u.img->cmd;
335 *cmd_len = desc->u.img->cmd_len;
336 break;
337 case INTEL_DESC_SURFACE_UNUSED:
338 default:
339 *cmd = NULL;
340 *cmd_len = 0;
341 break;
342 }
343}
344
345void intel_desc_region_read_sampler(const struct intel_desc_region *region,
346 const struct intel_desc_offset *offset,
347 const struct intel_sampler **sampler)
348{
349 const struct intel_desc_sampler *desc;
350 struct intel_desc_offset end;
351
352 intel_desc_offset_set(&end,
353 offset->surface, offset->sampler + region->sampler_desc_size);
354 desc_region_validate_begin_end(region, offset, &end);
355
356 desc = (const struct intel_desc_sampler *)
357 ((const char *) region->samplers + offset->sampler);
358
359 *sampler = desc->sampler;
360}
361
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800362static void desc_pool_destroy(struct intel_obj *obj)
Chia-I Wuf8385062015-01-04 16:27:24 +0800363{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800364 struct intel_desc_pool *pool = intel_desc_pool_from_obj(obj);
Chia-I Wuf8385062015-01-04 16:27:24 +0800365
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800366 intel_desc_pool_destroy(pool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800367}
368
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600369VkResult intel_desc_pool_create(struct intel_dev *dev,
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -0600370 const VkDescriptorPoolCreateInfo *info,
371 struct intel_desc_pool **pool_ret)
Chia-I Wuf8385062015-01-04 16:27:24 +0800372{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800373 struct intel_desc_pool *pool;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600374 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800375
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800376 pool = (struct intel_desc_pool *) intel_base_create(&dev->base.handle,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600377 sizeof(*pool), dev->base.dbg, VK_OBJECT_TYPE_DESCRIPTOR_POOL,
Chia-I Wu545c2e12015-02-22 13:19:54 +0800378 info, 0);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800379 if (!pool)
Tony Barbour8205d902015-04-16 15:59:00 -0600380 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800381
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800382 pool->dev = dev;
Chia-I Wuf8385062015-01-04 16:27:24 +0800383
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -0600384 ret = intel_desc_region_alloc(dev->desc_region, info->maxSets, info,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800385 &pool->region_begin, &pool->region_end);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600386 if (ret != VK_SUCCESS) {
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800387 intel_base_destroy(&pool->obj.base);
Chia-I Wuf8385062015-01-04 16:27:24 +0800388 return ret;
389 }
390
391 /* point to head */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800392 pool->cur = pool->region_begin;
Chia-I Wuf8385062015-01-04 16:27:24 +0800393
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800394 pool->obj.destroy = desc_pool_destroy;
Chia-I Wuf8385062015-01-04 16:27:24 +0800395
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800396 *pool_ret = pool;
Chia-I Wuf8385062015-01-04 16:27:24 +0800397
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600398 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800399}
400
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800401void intel_desc_pool_destroy(struct intel_desc_pool *pool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800402{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800403 intel_desc_region_free(pool->dev->desc_region,
404 &pool->region_begin, &pool->region_end);
405 intel_base_destroy(&pool->obj.base);
Chia-I Wuf8385062015-01-04 16:27:24 +0800406}
407
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600408VkResult intel_desc_pool_alloc(struct intel_desc_pool *pool,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800409 const struct intel_desc_layout *layout,
410 struct intel_desc_offset *begin,
411 struct intel_desc_offset *end)
Chia-I Wuf8385062015-01-04 16:27:24 +0800412{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800413 *begin = pool->cur;
414 intel_desc_offset_add(end, &pool->cur, &layout->region_size);
Chia-I Wuf8385062015-01-04 16:27:24 +0800415
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800416 if (!intel_desc_offset_within(end, &pool->region_end))
Tony Barbour8205d902015-04-16 15:59:00 -0600417 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800418
419 /* increment the writer pointer */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800420 pool->cur = *end;
Chia-I Wuf8385062015-01-04 16:27:24 +0800421
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600422 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800423}
424
Chia-I Wudee95612015-03-26 15:23:52 +0800425void intel_desc_pool_reset(struct intel_desc_pool *pool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800426{
427 /* reset to head */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800428 pool->cur = pool->region_begin;
Chia-I Wuf8385062015-01-04 16:27:24 +0800429}
430
431static void desc_set_destroy(struct intel_obj *obj)
432{
433 struct intel_desc_set *set = intel_desc_set_from_obj(obj);
434
435 intel_desc_set_destroy(set);
436}
437
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600438VkResult intel_desc_set_create(struct intel_dev *dev,
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -0600439 struct intel_desc_pool *pool,
440 const struct intel_desc_layout *layout,
441 struct intel_desc_set **set_ret)
Chia-I Wuf8385062015-01-04 16:27:24 +0800442{
443 struct intel_desc_set *set;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600444 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800445
Chia-I Wu545c2e12015-02-22 13:19:54 +0800446 set = (struct intel_desc_set *) intel_base_create(&dev->base.handle,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600447 sizeof(*set), dev->base.dbg, VK_OBJECT_TYPE_DESCRIPTOR_SET,
Chia-I Wu545c2e12015-02-22 13:19:54 +0800448 NULL, 0);
Chia-I Wuf8385062015-01-04 16:27:24 +0800449 if (!set)
Tony Barbour8205d902015-04-16 15:59:00 -0600450 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800451
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800452 set->region = dev->desc_region;
453 ret = intel_desc_pool_alloc(pool, layout,
454 &set->region_begin, &set->region_end);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600455 if (ret != VK_SUCCESS) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800456 intel_base_destroy(&set->obj.base);
457 return ret;
458 }
459
460 set->layout = layout;
461
462 set->obj.destroy = desc_set_destroy;
463
464 *set_ret = set;
465
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600466 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800467}
468
469void intel_desc_set_destroy(struct intel_desc_set *set)
470{
471 intel_base_destroy(&set->obj.base);
472}
473
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600474static bool desc_set_img_layout_read_only(VkImageLayout layout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800475{
476 switch (layout) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600477 case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
478 case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
479 case VK_IMAGE_LAYOUT_TRANSFER_SOURCE_OPTIMAL:
Chia-I Wuf8385062015-01-04 16:27:24 +0800480 return true;
481 default:
482 return false;
483 }
484}
485
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800486static void desc_set_write_sampler(struct intel_desc_set *set,
487 const struct intel_desc_iter *iter,
488 const struct intel_sampler *sampler)
Chia-I Wuf8385062015-01-04 16:27:24 +0800489{
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800490 struct intel_desc_sampler desc;
Chia-I Wuf8385062015-01-04 16:27:24 +0800491
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800492 desc.sampler = sampler;
493 intel_desc_region_update(set->region, &iter->begin, &iter->end,
494 NULL, &desc);
Chia-I Wuf8385062015-01-04 16:27:24 +0800495}
496
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800497static void desc_set_write_combined_image_sampler(struct intel_desc_set *set,
498 const struct intel_desc_iter *iter,
499 const struct intel_img_view *img_view,
500 VkImageLayout img_layout,
501 const struct intel_sampler *sampler)
Chia-I Wuf8385062015-01-04 16:27:24 +0800502{
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800503 struct intel_desc_surface view_desc;
504 struct intel_desc_sampler sampler_desc;
Chia-I Wuf8385062015-01-04 16:27:24 +0800505
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800506 view_desc.mem = img_view->img->obj.mem;
507 view_desc.read_only = desc_set_img_layout_read_only(img_layout);
508 view_desc.type = INTEL_DESC_SURFACE_IMG;
509 view_desc.u.img = img_view;
Chia-I Wuf8385062015-01-04 16:27:24 +0800510
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800511 sampler_desc.sampler = sampler;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800512
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800513 intel_desc_region_update(set->region, &iter->begin, &iter->end,
514 &view_desc, &sampler_desc);
Chia-I Wuf8385062015-01-04 16:27:24 +0800515}
516
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800517static void desc_set_write_image(struct intel_desc_set *set,
518 const struct intel_desc_iter *iter,
519 const struct intel_img_view *img_view,
520 VkImageLayout img_layout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800521{
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800522 struct intel_desc_surface desc;
Chia-I Wuf8385062015-01-04 16:27:24 +0800523
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800524 desc.mem = img_view->img->obj.mem;
525 desc.read_only = desc_set_img_layout_read_only(img_layout);
526 desc.type = INTEL_DESC_SURFACE_IMG;
527 desc.u.img = img_view;
528 intel_desc_region_update(set->region, &iter->begin, &iter->end,
529 &desc, NULL);
Chia-I Wuf8385062015-01-04 16:27:24 +0800530}
531
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800532static void desc_set_write_buffer(struct intel_desc_set *set,
533 const struct intel_desc_iter *iter,
534 const struct intel_buf_view *buf_view)
Chia-I Wuf8385062015-01-04 16:27:24 +0800535{
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800536 struct intel_desc_surface desc;
Chia-I Wuf8385062015-01-04 16:27:24 +0800537
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800538 desc.mem = buf_view->buf->obj.mem;
539 desc.read_only = false;
540 desc.type = INTEL_DESC_SURFACE_BUF;
Courtney Goeltzenleuchter2a3e3a32015-09-11 15:29:21 -0600541 memcpy(&desc.u.buf, buf_view, sizeof(*buf_view));
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800542 intel_desc_region_update(set->region, &iter->begin, &iter->end,
543 &desc, NULL);
Chia-I Wuf8385062015-01-04 16:27:24 +0800544}
545
546static void desc_layout_destroy(struct intel_obj *obj)
547{
548 struct intel_desc_layout *layout = intel_desc_layout_from_obj(obj);
549
550 intel_desc_layout_destroy(layout);
551}
552
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600553static VkResult desc_layout_init_bindings(struct intel_desc_layout *layout,
Chia-I Wufc9d9132015-03-26 15:04:41 +0800554 const struct intel_desc_region *region,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600555 const VkDescriptorSetLayoutCreateInfo *info)
Chia-I Wuf8385062015-01-04 16:27:24 +0800556{
557 struct intel_desc_offset offset;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800558 uint32_t i;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600559 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800560
Chia-I Wu7732cb22015-03-26 15:27:55 +0800561 intel_desc_offset_set(&offset, 0, 0);
Chia-I Wuf8385062015-01-04 16:27:24 +0800562
Chia-I Wufc9d9132015-03-26 15:04:41 +0800563 /* allocate bindings */
564 layout->bindings = intel_alloc(layout, sizeof(layout->bindings[0]) *
Tony Barbour8205d902015-04-16 15:59:00 -0600565 info->count, 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wufc9d9132015-03-26 15:04:41 +0800566 if (!layout->bindings)
Tony Barbour8205d902015-04-16 15:59:00 -0600567 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wufc9d9132015-03-26 15:04:41 +0800568
569 memset(layout->bindings, 0, sizeof(layout->bindings[0]) * info->count);
570 layout->binding_count = info->count;
571
572 /* initialize bindings */
573 for (i = 0; i < info->count; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600574 const VkDescriptorSetLayoutBinding *lb = &info->pBinding[i];
Chia-I Wufc9d9132015-03-26 15:04:41 +0800575 struct intel_desc_layout_binding *binding = &layout->bindings[i];
Chia-I Wuf8385062015-01-04 16:27:24 +0800576 struct intel_desc_offset size;
577
Chia-I Wufc9d9132015-03-26 15:04:41 +0800578 switch (lb->descriptorType) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600579 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
Courtney Goeltzenleuchterad870812015-04-15 15:29:59 -0600580 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
Chia-I Wud3114a22015-05-25 16:22:52 +0800581 layout->dynamic_desc_count += lb->arraySize;
Chia-I Wufc9d9132015-03-26 15:04:41 +0800582 break;
583 default:
584 break;
585 }
586
Chia-I Wu7732cb22015-03-26 15:27:55 +0800587 /* lb->stageFlags does not gain us anything */
588 binding->type = lb->descriptorType;
Chia-I Wud3114a22015-05-25 16:22:52 +0800589 binding->array_size = lb->arraySize;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800590 binding->offset = offset;
591
Chia-I Wufc9d9132015-03-26 15:04:41 +0800592 ret = desc_region_get_desc_size(region,
593 lb->descriptorType, &size);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600594 if (ret != VK_SUCCESS)
Chia-I Wuf8385062015-01-04 16:27:24 +0800595 return ret;
596
Chia-I Wu310eece2015-03-27 12:56:09 +0800597 binding->increment = size;
598
599 /* copy immutable samplers */
600 if (lb->pImmutableSamplers) {
601 bool shared = true;
602 uint32_t j;
603
Chia-I Wud3114a22015-05-25 16:22:52 +0800604 for (j = 1; j < lb->arraySize; j++) {
Tony Barbourde4124d2015-07-03 10:33:54 -0600605 if (lb->pImmutableSamplers[j].handle != lb->pImmutableSamplers[0].handle) {
Chia-I Wu310eece2015-03-27 12:56:09 +0800606 shared = false;
607 break;
608 }
609 }
610
611 if (shared) {
612 binding->shared_immutable_sampler =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600613 intel_sampler((VkSampler) lb->pImmutableSamplers[0]);
Chia-I Wu310eece2015-03-27 12:56:09 +0800614 /* set sampler offset increment to 0 */
615 intel_desc_offset_set(&binding->increment,
616 binding->increment.surface, 0);
617 } else {
618 binding->immutable_samplers = intel_alloc(layout,
Chia-I Wud3114a22015-05-25 16:22:52 +0800619 sizeof(binding->immutable_samplers[0]) * lb->arraySize,
Tony Barbour8205d902015-04-16 15:59:00 -0600620 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu310eece2015-03-27 12:56:09 +0800621 if (!binding->immutable_samplers)
Tony Barbour8205d902015-04-16 15:59:00 -0600622 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wu310eece2015-03-27 12:56:09 +0800623
Chia-I Wud3114a22015-05-25 16:22:52 +0800624 for (j = 0; j < lb->arraySize; j++) {
Chia-I Wu310eece2015-03-27 12:56:09 +0800625 binding->immutable_samplers[j] =
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600626 intel_sampler((VkSampler) lb->pImmutableSamplers[j]);
Chia-I Wu310eece2015-03-27 12:56:09 +0800627 }
628 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800629 }
630
Chia-I Wu7732cb22015-03-26 15:27:55 +0800631 /* increment offset */
Chia-I Wufc9d9132015-03-26 15:04:41 +0800632 intel_desc_offset_mad(&size, &binding->increment, &size,
Chia-I Wud3114a22015-05-25 16:22:52 +0800633 lb->arraySize - 1);
Chia-I Wuf8385062015-01-04 16:27:24 +0800634 intel_desc_offset_add(&offset, &offset, &size);
Chia-I Wuf8385062015-01-04 16:27:24 +0800635 }
636
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800637 layout->region_size = offset;
Chia-I Wuf8385062015-01-04 16:27:24 +0800638
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600639 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800640}
641
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600642VkResult intel_desc_layout_create(struct intel_dev *dev,
643 const VkDescriptorSetLayoutCreateInfo *info,
Chia-I Wuf8385062015-01-04 16:27:24 +0800644 struct intel_desc_layout **layout_ret)
645{
646 struct intel_desc_layout *layout;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600647 VkResult ret;
Chia-I Wuf8385062015-01-04 16:27:24 +0800648
Chia-I Wu545c2e12015-02-22 13:19:54 +0800649 layout = (struct intel_desc_layout *) intel_base_create(&dev->base.handle,
650 sizeof(*layout), dev->base.dbg,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600651 VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, info, 0);
Chia-I Wuf8385062015-01-04 16:27:24 +0800652 if (!layout)
Tony Barbour8205d902015-04-16 15:59:00 -0600653 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800654
Chia-I Wu7732cb22015-03-26 15:27:55 +0800655 ret = desc_layout_init_bindings(layout, dev->desc_region, info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600656 if (ret != VK_SUCCESS) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800657 intel_desc_layout_destroy(layout);
658 return ret;
659 }
660
661 layout->obj.destroy = desc_layout_destroy;
662
663 *layout_ret = layout;
664
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600665 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800666}
667
668void intel_desc_layout_destroy(struct intel_desc_layout *layout)
669{
Chia-I Wu310eece2015-03-27 12:56:09 +0800670 uint32_t i;
671
672 for (i = 0; i < layout->binding_count; i++) {
673 struct intel_desc_layout_binding *binding = &layout->bindings[i];
674
675 if (binding->immutable_samplers)
676 intel_free(layout, binding->immutable_samplers);
677 }
Chia-I Wufc9d9132015-03-26 15:04:41 +0800678 intel_free(layout, layout->bindings);
Chia-I Wuf8385062015-01-04 16:27:24 +0800679 intel_base_destroy(&layout->obj.base);
680}
681
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500682static void pipeline_layout_destroy(struct intel_obj *obj)
Chia-I Wuf8385062015-01-04 16:27:24 +0800683{
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500684 struct intel_pipeline_layout *pipeline_layout =
685 intel_pipeline_layout_from_obj(obj);
Chia-I Wuf8385062015-01-04 16:27:24 +0800686
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500687 intel_pipeline_layout_destroy(pipeline_layout);
Chia-I Wuf8385062015-01-04 16:27:24 +0800688}
689
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500690VkResult intel_pipeline_layout_create(struct intel_dev *dev,
691 const VkPipelineLayoutCreateInfo *pPipelineCreateInfo,
692 struct intel_pipeline_layout **pipeline_layout_ret)
Chia-I Wuf8385062015-01-04 16:27:24 +0800693{
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500694 struct intel_pipeline_layout *pipeline_layout;
695 uint32_t count = pPipelineCreateInfo->descriptorSetCount;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800696 uint32_t i;
697
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500698 pipeline_layout = (struct intel_pipeline_layout *) intel_base_create(
699 &dev->base.handle, sizeof(*pipeline_layout), dev->base.dbg,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600700 VK_OBJECT_TYPE_PIPELINE_LAYOUT, NULL, 0);
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500701
702 if (!pipeline_layout)
Tony Barbour8205d902015-04-16 15:59:00 -0600703 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800704
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500705 pipeline_layout->layouts = intel_alloc(pipeline_layout,
706 sizeof(pipeline_layout->layouts[0]) * count,
707 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
708 if (!pipeline_layout->layouts) {
709 intel_pipeline_layout_destroy(pipeline_layout);
Tony Barbour8205d902015-04-16 15:59:00 -0600710 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wuf8385062015-01-04 16:27:24 +0800711 }
712
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500713 pipeline_layout->dynamic_desc_indices = intel_alloc(pipeline_layout,
714 sizeof(pipeline_layout->dynamic_desc_indices[0]) * count,
Tony Barbour8205d902015-04-16 15:59:00 -0600715 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500716 if (!pipeline_layout->dynamic_desc_indices) {
717 intel_pipeline_layout_destroy(pipeline_layout);
Tony Barbour8205d902015-04-16 15:59:00 -0600718 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wu862c5572015-03-28 15:23:55 +0800719 }
720
721 for (i = 0; i < count; i++) {
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500722 pipeline_layout->layouts[i] = intel_desc_layout(pPipelineCreateInfo->pSetLayouts[i]);
723 pipeline_layout->dynamic_desc_indices[i] = pipeline_layout->total_dynamic_desc_count;
Chia-I Wu862c5572015-03-28 15:23:55 +0800724
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500725 pipeline_layout->total_dynamic_desc_count +=
726 pipeline_layout->layouts[i]->dynamic_desc_count;
Chia-I Wu862c5572015-03-28 15:23:55 +0800727 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800728
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500729 pipeline_layout->layout_count = count;
Chia-I Wuf8385062015-01-04 16:27:24 +0800730
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500731 pipeline_layout->obj.destroy = pipeline_layout_destroy;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800732
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500733 *pipeline_layout_ret = pipeline_layout;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800734
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600735 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800736}
737
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500738void intel_pipeline_layout_destroy(struct intel_pipeline_layout *pipeline_layout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800739{
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500740 if (pipeline_layout->dynamic_desc_indices)
741 intel_free(pipeline_layout, pipeline_layout->dynamic_desc_indices);
742 if (pipeline_layout->layouts)
743 intel_free(pipeline_layout, pipeline_layout->layouts);
744 intel_base_destroy(&pipeline_layout->obj.base);
Chia-I Wuf8385062015-01-04 16:27:24 +0800745}
746
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600747ICD_EXPORT VkResult VKAPI vkCreateDescriptorSetLayout(
748 VkDevice device,
749 const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
750 VkDescriptorSetLayout* pSetLayout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800751{
752 struct intel_dev *dev = intel_dev(device);
Chia-I Wuf8385062015-01-04 16:27:24 +0800753
Chia-I Wu7732cb22015-03-26 15:27:55 +0800754 return intel_desc_layout_create(dev, pCreateInfo,
Chia-I Wuf8385062015-01-04 16:27:24 +0800755 (struct intel_desc_layout **) pSetLayout);
756}
757
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600758ICD_EXPORT void VKAPI vkDestroyDescriptorSetLayout(
Tony Barbourde4124d2015-07-03 10:33:54 -0600759 VkDevice device,
760 VkDescriptorSetLayout descriptorSetLayout)
761
762{
763 struct intel_obj *obj = intel_obj(descriptorSetLayout.handle);
764
765 obj->destroy(obj);
Tony Barbourde4124d2015-07-03 10:33:54 -0600766}
767
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500768ICD_EXPORT VkResult VKAPI vkCreatePipelineLayout(
769 VkDevice device,
770 const VkPipelineLayoutCreateInfo* pCreateInfo,
771 VkPipelineLayout* pPipelineLayout)
Chia-I Wu7732cb22015-03-26 15:27:55 +0800772{
773 struct intel_dev *dev = intel_dev(device);
774
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500775 return intel_pipeline_layout_create(dev,
776 pCreateInfo,
777 (struct intel_pipeline_layout **) pPipelineLayout);
Chia-I Wu7732cb22015-03-26 15:27:55 +0800778}
779
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600780ICD_EXPORT void VKAPI vkDestroyPipelineLayout(
Tony Barbourde4124d2015-07-03 10:33:54 -0600781 VkDevice device,
782 VkPipelineLayout pipelineLayout)
783
784{
785 struct intel_obj *obj = intel_obj(pipelineLayout.handle);
786
787 obj->destroy(obj);
Tony Barbourde4124d2015-07-03 10:33:54 -0600788}
789
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600790ICD_EXPORT VkResult VKAPI vkCreateDescriptorPool(
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -0600791 VkDevice device,
792 const VkDescriptorPoolCreateInfo* pCreateInfo,
793 VkDescriptorPool* pDescriptorPool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800794{
795 struct intel_dev *dev = intel_dev(device);
796
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -0600797 return intel_desc_pool_create(dev, pCreateInfo,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800798 (struct intel_desc_pool **) pDescriptorPool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800799}
800
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600801ICD_EXPORT void VKAPI vkDestroyDescriptorPool(
Tony Barbourde4124d2015-07-03 10:33:54 -0600802 VkDevice device,
803 VkDescriptorPool descriptorPool)
804
805{
806 struct intel_obj *obj = intel_obj(descriptorPool.handle);
807
808 obj->destroy(obj);
Tony Barbourde4124d2015-07-03 10:33:54 -0600809}
810
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600811ICD_EXPORT VkResult VKAPI vkResetDescriptorPool(
Mike Stroyan230e6252015-04-17 12:36:38 -0600812 VkDevice device,
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -0600813 VkDescriptorPool descriptorPool,
814 VkDescriptorPoolResetFlags flags)
Chia-I Wuf8385062015-01-04 16:27:24 +0800815{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800816 struct intel_desc_pool *pool = intel_desc_pool(descriptorPool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800817
Chia-I Wudee95612015-03-26 15:23:52 +0800818 intel_desc_pool_reset(pool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800819
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600820 return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800821}
822
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600823ICD_EXPORT VkResult VKAPI vkAllocDescriptorSets(
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -0600824 VkDevice device,
825 const VkDescriptorSetAllocInfo* pAllocInfo,
826 VkDescriptorSet* pDescriptorSets)
Chia-I Wuf8385062015-01-04 16:27:24 +0800827{
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -0600828 struct intel_desc_pool *pool = intel_desc_pool(pAllocInfo->descriptorPool);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800829 struct intel_dev *dev = pool->dev;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600830 VkResult ret = VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +0800831 uint32_t i;
832
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -0600833 for (i = 0; i < pAllocInfo->count; i++) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800834 const struct intel_desc_layout *layout =
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -0600835 intel_desc_layout((VkDescriptorSetLayout) pAllocInfo->pSetLayouts[i]);
Chia-I Wuf8385062015-01-04 16:27:24 +0800836
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -0600837 ret = intel_desc_set_create(dev, pool, layout,
Chia-I Wuf8385062015-01-04 16:27:24 +0800838 (struct intel_desc_set **) &pDescriptorSets[i]);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600839 if (ret != VK_SUCCESS)
Chia-I Wuf8385062015-01-04 16:27:24 +0800840 break;
841 }
842
Chia-I Wuf8385062015-01-04 16:27:24 +0800843 return ret;
844}
845
Tony Barbourb857d312015-07-10 10:50:45 -0600846ICD_EXPORT VkResult VKAPI vkFreeDescriptorSets(
847 VkDevice device,
848 VkDescriptorPool descriptorPool,
849 uint32_t count,
850 const VkDescriptorSet* pDescriptorSets)
851{
852 uint32_t i;
853
854 for (i = 0; i < count; i++) {
855 intel_desc_set_destroy(
856 *(struct intel_desc_set **) &pDescriptorSets[i]);
857 }
858 return VK_SUCCESS;
859}
860
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600861ICD_EXPORT void VKAPI vkUpdateDescriptorSets(
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800862 VkDevice device,
863 uint32_t writeCount,
864 const VkWriteDescriptorSet* pDescriptorWrites,
865 uint32_t copyCount,
866 const VkCopyDescriptorSet* pDescriptorCopies)
Chia-I Wuf8385062015-01-04 16:27:24 +0800867{
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800868 uint32_t i, j;
Chia-I Wuf8385062015-01-04 16:27:24 +0800869
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800870 for (i = 0; i < writeCount; i++) {
871 const VkWriteDescriptorSet *write = &pDescriptorWrites[i];
872 struct intel_desc_set *set = intel_desc_set(write->destSet);
873 const struct intel_desc_layout_binding *binding;
874 struct intel_desc_iter iter;
Chia-I Wuf8385062015-01-04 16:27:24 +0800875
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800876 if (!desc_iter_init_for_writing(&iter, set, write->destBinding,
877 write->destArrayElement) ||
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600878 iter.type != write->descriptorType) {
879 /* TODOVV: is this covered in validation? */
880// return VK_ERROR_INVALID_VALUE;
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600881// return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600882 }
Chia-I Wu7732cb22015-03-26 15:27:55 +0800883
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800884 switch (write->descriptorType) {
885 case VK_DESCRIPTOR_TYPE_SAMPLER:
886 for (j = 0; j < write->count; j++) {
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600887 const VkDescriptorImageInfo *info = &write->pImageInfo[j];
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800888 const struct intel_sampler *sampler =
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600889 intel_sampler(info->sampler);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800890
891 desc_set_write_sampler(set, &iter, sampler);
892
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600893 if (!intel_desc_iter_advance(&iter)) {
894 /* TODOVV: is this covered in validation? */
895// return VK_ERROR_INVALID_VALUE;
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600896// return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600897 }
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800898 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800899 break;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800900 case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
901 binding = &set->layout->bindings[write->destBinding];
902
903 /* write the shared immutable sampler */
904 if (binding->shared_immutable_sampler) {
905 struct intel_desc_offset end;
906 struct intel_desc_sampler sampler_desc;
907
908 assert(!iter.increment.sampler);
909 intel_desc_offset_set(&end, iter.begin.surface,
910 iter.begin.sampler + set->region->sampler_desc_size);
911
912 sampler_desc.sampler = binding->shared_immutable_sampler;
913 intel_desc_region_update(set->region, &iter.begin, &end,
914 NULL, &sampler_desc);
915 }
916
917 for (j = 0; j < write->count; j++) {
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600918 const VkDescriptorImageInfo *info = &write->pImageInfo[j];
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800919 const struct intel_img_view *img_view =
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600920 intel_img_view(info->imageView);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800921 const struct intel_sampler *sampler =
922 (binding->immutable_samplers) ?
923 binding->immutable_samplers[write->destArrayElement + j] :
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600924 intel_sampler(info->sampler);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800925
926 desc_set_write_combined_image_sampler(set, &iter,
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600927 img_view, info->imageLayout, sampler);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800928
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600929 if (!intel_desc_iter_advance(&iter)) {
930 /* TODOVV: Move test to validation */
931// return VK_ERROR_INVALID_VALUE;
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600932// return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600933 }
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800934 }
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++) {
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600939 const VkDescriptorImageInfo *info = &write->pImageInfo[j];
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800940 const struct intel_img_view *img_view =
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600941 intel_img_view(info->imageView);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800942
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600943 desc_set_write_image(set, &iter, img_view, info->imageLayout);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800944
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600945 if (!intel_desc_iter_advance(&iter)) {
946 /* TODOVV: Move test to validation */
947// return VK_ERROR_INVALID_VALUE;
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600948// return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600949 }
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800950 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800951 break;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800952 case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
953 case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800954 for (j = 0; j < write->count; j++) {
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800955 const struct intel_buf_view *buf_view =
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600956 intel_buf_view(write->pTexelBufferView[j]);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800957
958 desc_set_write_buffer(set, &iter, buf_view);
959
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600960 if (!intel_desc_iter_advance(&iter)) {
961 /* TODOVV: Move test to validation */
962// return VK_ERROR_INVALID_VALUE;
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600963// return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600964 }
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800965 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800966 break;
Courtney Goeltzenleuchter2a3e3a32015-09-11 15:29:21 -0600967 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
968 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
969 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
970 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
971 {
972 const struct intel_dev *dev = intel_dev(device);
973 VkBufferViewCreateInfo view_info;
974 memset(&view_info, 0, sizeof(view_info));
975 view_info.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
Courtney Goeltzenleuchter2a3e3a32015-09-11 15:29:21 -0600976
977 for (j = 0; j < write->count; j++) {
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600978 const VkDescriptorBufferInfo *info = &write->pBufferInfo[j];
Courtney Goeltzenleuchter2a3e3a32015-09-11 15:29:21 -0600979 struct intel_buf_view buf_view;
980
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600981 view_info.buffer = info->buffer;
982 view_info.offset = info->offset;
983 view_info.range = info->range;
Courtney Goeltzenleuchter2a3e3a32015-09-11 15:29:21 -0600984
Courtney Goeltzenleuchter4f7bb0a2015-09-14 16:36:13 -0600985 intel_buf_view_init(dev, &view_info, &buf_view, true);
Courtney Goeltzenleuchter2a3e3a32015-09-11 15:29:21 -0600986
987 desc_set_write_buffer(set, &iter, &buf_view);
988
989 if (!intel_desc_iter_advance(&iter)) {
990 /* TODOVV: Move test to validation */
991 // return VK_ERROR_INVALID_VALUE;
992 // return VK_ERROR_UNKNOWN;
993 }
994 }
995 }
996 break;
Chia-I Wuf8385062015-01-04 16:27:24 +0800997 default:
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600998 /* TODOVV: Make sure validation layer covers this case */
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600999// return VK_ERROR_UNKNOWN;
Chia-I Wuf8385062015-01-04 16:27:24 +08001000 break;
1001 }
Chia-I Wuf8385062015-01-04 16:27:24 +08001002 }
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001003
1004 for (i = 0; i < copyCount; i++) {
1005 const VkCopyDescriptorSet *copy = &pDescriptorCopies[i];
1006 const struct intel_desc_set *src_set = intel_desc_set(copy->srcSet);
1007 const struct intel_desc_set *dst_set = intel_desc_set(copy->destSet);
1008 struct intel_desc_iter src_iter, dst_iter;
1009 struct intel_desc_offset src_begin, dst_begin;
1010
1011 if (!desc_iter_init_for_writing(&src_iter, src_set,
1012 copy->srcBinding, copy->srcArrayElement) ||
1013 !desc_iter_init_for_writing(&dst_iter, dst_set,
1014 copy->destBinding, copy->destArrayElement) ||
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -06001015 src_iter.type != dst_iter.type) {
1016 /* TODOVV: Move test to validation layer */
1017// return VK_ERROR_INVALID_VALUE;
Mark Lobodzinski67b42b72015-09-07 13:59:43 -06001018// return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -06001019 }
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001020
1021 /* disallow combined image samplers */
Mark Lobodzinski67b42b72015-09-07 13:59:43 -06001022 /* TODOVV: Move test to validation layer */
1023 //if (dst_iter.type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
1024 // return VK_ERROR_UNKNOWN;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001025
1026 /* save the begin offsets */
1027 src_begin = src_iter.begin;
1028 dst_begin = dst_iter.begin;
1029
1030 /* advance to the end */
1031 for (j = 0; j < copy->count; j++) {
1032 if (!intel_desc_iter_advance(&src_iter) ||
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -06001033 !intel_desc_iter_advance(&dst_iter)) {
1034 /* TODOVV: Move test to validation layer */
1035// return VK_ERROR_INVALID_VALUE;
Mark Lobodzinski67b42b72015-09-07 13:59:43 -06001036// return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -06001037 }
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001038 }
1039
1040 intel_desc_region_copy(dst_set->region, &dst_begin,
1041 &dst_iter.end, &src_begin);
1042 }
1043
Mark Lobodzinski67b42b72015-09-07 13:59:43 -06001044// return VK_SUCCESS;
Chia-I Wuf8385062015-01-04 16:27:24 +08001045}