2
* Copyright © 2021 Collabora Ltd.
5
* Copyright © 2016 Red Hat.
6
* Copyright © 2016 Bas Nieuwenhuizen
8
* Permission is hereby granted, free of charge, to any person obtaining a
9
* copy of this software and associated documentation files (the "Software"),
10
* to deal in the Software without restriction, including without limitation
11
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
12
* and/or sell copies of the Software, and to permit persons to whom the
13
* Software is furnished to do so, subject to the following conditions:
15
* The above copyright notice and this permission notice (including the next
16
* paragraph) shall be included in all copies or substantial portions of the
19
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25
* DEALINGS IN THE SOFTWARE.
28
#include "genxml/gen_macros.h"
30
#include "panvk_private.h"
38
#include "util/mesa-sha1.h"
39
#include "vk_descriptors.h"
45
#define PANVK_DESCRIPTOR_ALIGN 8
47
struct panvk_bview_desc {
52
panvk_fill_bview_desc(struct panvk_bview_desc *desc,
53
struct panvk_buffer_view *view)
55
desc->elems = view->elems;
58
struct panvk_image_desc {
67
panvk_fill_image_desc(struct panvk_image_desc *desc,
68
struct panvk_image_view *view)
70
desc->width = view->vk.extent.width - 1;
71
desc->height = view->vk.extent.height - 1;
72
desc->depth = view->vk.extent.depth - 1;
73
desc->levels = view->vk.level_count;
74
desc->samples = view->vk.image->samples;
76
/* Stick array layer count after the last valid size component */
77
if (view->vk.image->image_type == VK_IMAGE_TYPE_1D)
78
desc->height = view->vk.layer_count - 1;
79
else if (view->vk.image->image_type == VK_IMAGE_TYPE_2D)
80
desc->depth = view->vk.layer_count - 1;
84
panvk_per_arch(CreateDescriptorSetLayout)(VkDevice _device,
85
const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
86
const VkAllocationCallbacks *pAllocator,
87
VkDescriptorSetLayout *pSetLayout)
89
VK_FROM_HANDLE(panvk_device, device, _device);
90
struct panvk_descriptor_set_layout *set_layout;
91
VkDescriptorSetLayoutBinding *bindings = NULL;
92
unsigned num_bindings = 0;
95
if (pCreateInfo->bindingCount) {
97
vk_create_sorted_bindings(pCreateInfo->pBindings,
98
pCreateInfo->bindingCount,
100
if (result != VK_SUCCESS)
101
return vk_error(device, result);
103
num_bindings = bindings[pCreateInfo->bindingCount - 1].binding + 1;
106
unsigned num_immutable_samplers = 0;
107
for (unsigned i = 0; i < pCreateInfo->bindingCount; i++) {
108
if (bindings[i].pImmutableSamplers)
109
num_immutable_samplers += bindings[i].descriptorCount;
112
size_t size = sizeof(*set_layout) +
113
(sizeof(struct panvk_descriptor_set_binding_layout) *
115
(sizeof(struct panvk_sampler *) * num_immutable_samplers);
116
set_layout = vk_descriptor_set_layout_zalloc(&device->vk, size);
118
result = VK_ERROR_OUT_OF_HOST_MEMORY;
119
goto err_free_bindings;
122
struct panvk_sampler **immutable_samplers =
123
(struct panvk_sampler **)((uint8_t *)set_layout + sizeof(*set_layout) +
124
(sizeof(struct panvk_descriptor_set_binding_layout) *
127
set_layout->binding_count = num_bindings;
129
unsigned sampler_idx = 0, tex_idx = 0, ubo_idx = 0;
130
unsigned dyn_ubo_idx = 0, dyn_ssbo_idx = 0, img_idx = 0;
131
uint32_t desc_ubo_size = 0;
133
for (unsigned i = 0; i < pCreateInfo->bindingCount; i++) {
134
const VkDescriptorSetLayoutBinding *binding = &bindings[i];
135
struct panvk_descriptor_set_binding_layout *binding_layout =
136
&set_layout->bindings[binding->binding];
138
binding_layout->type = binding->descriptorType;
139
binding_layout->array_size = binding->descriptorCount;
140
binding_layout->shader_stages = binding->stageFlags;
141
binding_layout->desc_ubo_stride = 0;
142
if (binding->pImmutableSamplers) {
143
binding_layout->immutable_samplers = immutable_samplers;
144
immutable_samplers += binding_layout->array_size;
145
for (unsigned j = 0; j < binding_layout->array_size; j++) {
146
VK_FROM_HANDLE(panvk_sampler, sampler, binding->pImmutableSamplers[j]);
147
binding_layout->immutable_samplers[j] = sampler;
151
switch (binding_layout->type) {
152
case VK_DESCRIPTOR_TYPE_SAMPLER:
153
binding_layout->sampler_idx = sampler_idx;
154
sampler_idx += binding_layout->array_size;
156
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
157
binding_layout->sampler_idx = sampler_idx;
158
binding_layout->tex_idx = tex_idx;
159
sampler_idx += binding_layout->array_size;
160
tex_idx += binding_layout->array_size;
161
binding_layout->desc_ubo_stride = sizeof(struct panvk_image_desc);
163
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
164
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
165
binding_layout->tex_idx = tex_idx;
166
tex_idx += binding_layout->array_size;
167
binding_layout->desc_ubo_stride = sizeof(struct panvk_image_desc);
169
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
170
binding_layout->tex_idx = tex_idx;
171
tex_idx += binding_layout->array_size;
172
binding_layout->desc_ubo_stride = sizeof(struct panvk_bview_desc);
174
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
175
binding_layout->dyn_ubo_idx = dyn_ubo_idx;
176
dyn_ubo_idx += binding_layout->array_size;
178
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
179
binding_layout->ubo_idx = ubo_idx;
180
ubo_idx += binding_layout->array_size;
182
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
183
binding_layout->dyn_ssbo_idx = dyn_ssbo_idx;
184
dyn_ssbo_idx += binding_layout->array_size;
186
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
187
binding_layout->desc_ubo_stride = sizeof(struct panvk_ssbo_addr);
189
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
190
binding_layout->img_idx = img_idx;
191
img_idx += binding_layout->array_size;
192
binding_layout->desc_ubo_stride = sizeof(struct panvk_image_desc);
194
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
195
binding_layout->img_idx = img_idx;
196
img_idx += binding_layout->array_size;
197
binding_layout->desc_ubo_stride = sizeof(struct panvk_bview_desc);
200
unreachable("Invalid descriptor type");
203
desc_ubo_size = ALIGN_POT(desc_ubo_size, PANVK_DESCRIPTOR_ALIGN);
204
binding_layout->desc_ubo_offset = desc_ubo_size;
205
desc_ubo_size += binding_layout->desc_ubo_stride *
206
binding_layout->array_size;
209
set_layout->desc_ubo_size = desc_ubo_size;
210
if (desc_ubo_size > 0)
211
set_layout->desc_ubo_index = ubo_idx++;
213
set_layout->num_samplers = sampler_idx;
214
set_layout->num_textures = tex_idx;
215
set_layout->num_ubos = ubo_idx;
216
set_layout->num_dyn_ubos = dyn_ubo_idx;
217
set_layout->num_dyn_ssbos = dyn_ssbo_idx;
218
set_layout->num_imgs = img_idx;
221
*pSetLayout = panvk_descriptor_set_layout_to_handle(set_layout);
226
return vk_error(device, result);
230
panvk_write_sampler_desc_raw(struct panvk_descriptor_set *set,
231
uint32_t binding, uint32_t elem,
232
struct panvk_sampler *sampler);
235
panvk_per_arch(descriptor_set_create)(struct panvk_device *device,
236
struct panvk_descriptor_pool *pool,
237
const struct panvk_descriptor_set_layout *layout,
238
struct panvk_descriptor_set **out_set)
240
struct panvk_descriptor_set *set;
242
/* TODO: Allocate from the pool! */
243
set = vk_object_zalloc(&device->vk, NULL,
244
sizeof(struct panvk_descriptor_set),
245
VK_OBJECT_TYPE_DESCRIPTOR_SET);
247
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
249
set->layout = layout;
251
if (layout->num_ubos) {
252
set->ubos = vk_zalloc(&device->vk.alloc,
253
pan_size(UNIFORM_BUFFER) * layout->num_ubos, 8,
254
VK_OBJECT_TYPE_DESCRIPTOR_SET);
259
if (layout->num_dyn_ubos) {
260
set->dyn_ubos = vk_zalloc(&device->vk.alloc,
261
sizeof(*set->dyn_ubos) * layout->num_dyn_ubos, 8,
262
VK_OBJECT_TYPE_DESCRIPTOR_SET);
267
if (layout->num_dyn_ssbos) {
268
set->dyn_ssbos = vk_zalloc(&device->vk.alloc,
269
sizeof(*set->dyn_ssbos) * layout->num_dyn_ssbos, 8,
270
VK_OBJECT_TYPE_DESCRIPTOR_SET);
275
if (layout->num_samplers) {
276
set->samplers = vk_zalloc(&device->vk.alloc,
277
pan_size(SAMPLER) * layout->num_samplers, 8,
278
VK_OBJECT_TYPE_DESCRIPTOR_SET);
283
if (layout->num_textures) {
285
vk_zalloc(&device->vk.alloc, pan_size(TEXTURE) * layout->num_textures,
286
8, VK_OBJECT_TYPE_DESCRIPTOR_SET);
291
if (layout->num_imgs) {
293
vk_zalloc(&device->vk.alloc,
294
sizeof(*set->img_fmts) * layout->num_imgs,
295
8, VK_OBJECT_TYPE_DESCRIPTOR_SET);
299
set->img_attrib_bufs =
300
vk_zalloc(&device->vk.alloc,
301
pan_size(ATTRIBUTE_BUFFER) * 2 * layout->num_imgs,
302
8, VK_OBJECT_TYPE_DESCRIPTOR_SET);
303
if (!set->img_attrib_bufs)
307
if (layout->desc_ubo_size) {
308
set->desc_bo = panfrost_bo_create(&device->physical_device->pdev,
309
layout->desc_ubo_size,
310
0, "Descriptor set");
314
struct mali_uniform_buffer_packed *ubos = set->ubos;
316
panvk_per_arch(emit_ubo)(set->desc_bo->ptr.gpu,
317
layout->desc_ubo_size,
318
&ubos[layout->desc_ubo_index]);
321
for (unsigned i = 0; i < layout->binding_count; i++) {
322
if (!layout->bindings[i].immutable_samplers)
325
for (unsigned j = 0; j < layout->bindings[i].array_size; j++) {
326
struct panvk_sampler *sampler =
327
layout->bindings[i].immutable_samplers[j];
328
panvk_write_sampler_desc_raw(set, i, j, sampler);
336
vk_free(&device->vk.alloc, set->textures);
337
vk_free(&device->vk.alloc, set->samplers);
338
vk_free(&device->vk.alloc, set->ubos);
339
vk_free(&device->vk.alloc, set->dyn_ubos);
340
vk_free(&device->vk.alloc, set->dyn_ssbos);
341
vk_free(&device->vk.alloc, set->img_fmts);
342
vk_free(&device->vk.alloc, set->img_attrib_bufs);
344
panfrost_bo_unreference(set->desc_bo);
345
vk_object_free(&device->vk, NULL, set);
346
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
350
panvk_per_arch(AllocateDescriptorSets)(VkDevice _device,
351
const VkDescriptorSetAllocateInfo *pAllocateInfo,
352
VkDescriptorSet *pDescriptorSets)
354
VK_FROM_HANDLE(panvk_device, device, _device);
355
VK_FROM_HANDLE(panvk_descriptor_pool, pool, pAllocateInfo->descriptorPool);
359
for (i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
360
VK_FROM_HANDLE(panvk_descriptor_set_layout, layout,
361
pAllocateInfo->pSetLayouts[i]);
362
struct panvk_descriptor_set *set = NULL;
364
result = panvk_per_arch(descriptor_set_create)(device, pool, layout, &set);
365
if (result != VK_SUCCESS)
368
pDescriptorSets[i] = panvk_descriptor_set_to_handle(set);
374
panvk_FreeDescriptorSets(_device, pAllocateInfo->descriptorPool, i, pDescriptorSets);
375
for (i = 0; i < pAllocateInfo->descriptorSetCount; i++)
376
pDescriptorSets[i] = VK_NULL_HANDLE;
382
panvk_desc_ubo_data(struct panvk_descriptor_set *set,
383
uint32_t binding, uint32_t elem)
385
const struct panvk_descriptor_set_binding_layout *binding_layout =
386
&set->layout->bindings[binding];
388
return (char *)set->desc_bo->ptr.cpu +
389
binding_layout->desc_ubo_offset +
390
elem * binding_layout->desc_ubo_stride;
393
static struct mali_sampler_packed *
394
panvk_sampler_desc(struct panvk_descriptor_set *set,
395
uint32_t binding, uint32_t elem)
397
const struct panvk_descriptor_set_binding_layout *binding_layout =
398
&set->layout->bindings[binding];
400
uint32_t sampler_idx = binding_layout->sampler_idx + elem;
402
return &((struct mali_sampler_packed *)set->samplers)[sampler_idx];
406
panvk_write_sampler_desc_raw(struct panvk_descriptor_set *set,
407
uint32_t binding, uint32_t elem,
408
struct panvk_sampler *sampler)
410
memcpy(panvk_sampler_desc(set, binding, elem),
411
&sampler->desc, sizeof(sampler->desc));
415
panvk_write_sampler_desc(UNUSED struct panvk_device *dev,
416
struct panvk_descriptor_set *set,
417
uint32_t binding, uint32_t elem,
418
const VkDescriptorImageInfo * const pImageInfo)
420
const struct panvk_descriptor_set_binding_layout *binding_layout =
421
&set->layout->bindings[binding];
423
if (binding_layout->immutable_samplers)
426
VK_FROM_HANDLE(panvk_sampler, sampler, pImageInfo->sampler);
427
panvk_write_sampler_desc_raw(set, binding, elem, sampler);
431
panvk_copy_sampler_desc(struct panvk_descriptor_set *dst_set,
432
uint32_t dst_binding, uint32_t dst_elem,
433
struct panvk_descriptor_set *src_set,
434
uint32_t src_binding, uint32_t src_elem)
436
const struct panvk_descriptor_set_binding_layout *dst_binding_layout =
437
&dst_set->layout->bindings[dst_binding];
439
if (dst_binding_layout->immutable_samplers)
442
memcpy(panvk_sampler_desc(dst_set, dst_binding, dst_elem),
443
panvk_sampler_desc(src_set, src_binding, src_elem),
444
sizeof(struct mali_sampler_packed));
447
static struct mali_texture_packed *
448
panvk_tex_desc(struct panvk_descriptor_set *set,
449
uint32_t binding, uint32_t elem)
451
const struct panvk_descriptor_set_binding_layout *binding_layout =
452
&set->layout->bindings[binding];
454
unsigned tex_idx = binding_layout->tex_idx + elem;
456
return &((struct mali_texture_packed *)set->textures)[tex_idx];
460
panvk_write_tex_desc(UNUSED struct panvk_device *dev,
461
struct panvk_descriptor_set *set,
462
uint32_t binding, uint32_t elem,
463
const VkDescriptorImageInfo * const pImageInfo)
465
VK_FROM_HANDLE(panvk_image_view, view, pImageInfo->imageView);
467
memcpy(panvk_tex_desc(set, binding, elem),
468
view->descs.tex, pan_size(TEXTURE));
470
panvk_fill_image_desc(panvk_desc_ubo_data(set, binding, elem), view);
474
panvk_copy_tex_desc(struct panvk_descriptor_set *dst_set,
475
uint32_t dst_binding, uint32_t dst_elem,
476
struct panvk_descriptor_set *src_set,
477
uint32_t src_binding, uint32_t src_elem)
479
*panvk_tex_desc(dst_set, dst_binding, dst_elem) =
480
*panvk_tex_desc(src_set, src_binding, src_elem);
482
/* Descriptor UBO data gets copied automatically */
486
panvk_write_tex_buf_desc(UNUSED struct panvk_device *dev,
487
struct panvk_descriptor_set *set,
488
uint32_t binding, uint32_t elem,
489
const VkBufferView bufferView)
491
VK_FROM_HANDLE(panvk_buffer_view, view, bufferView);
493
memcpy(panvk_tex_desc(set, binding, elem),
494
view->descs.tex, pan_size(TEXTURE));
496
panvk_fill_bview_desc(panvk_desc_ubo_data(set, binding, elem), view);
500
panvk_img_idx(struct panvk_descriptor_set *set,
501
uint32_t binding, uint32_t elem)
503
const struct panvk_descriptor_set_binding_layout *binding_layout =
504
&set->layout->bindings[binding];
506
return binding_layout->img_idx + elem;
510
panvk_write_img_desc(struct panvk_device *dev,
511
struct panvk_descriptor_set *set,
512
uint32_t binding, uint32_t elem,
513
const VkDescriptorImageInfo *pImageInfo)
515
const struct panfrost_device *pdev = &dev->physical_device->pdev;
516
VK_FROM_HANDLE(panvk_image_view, view, pImageInfo->imageView);
518
unsigned img_idx = panvk_img_idx(set, binding, elem);
519
void *attrib_buf = (uint8_t *)set->img_attrib_bufs +
520
(pan_size(ATTRIBUTE_BUFFER) * 2 * img_idx);
522
set->img_fmts[img_idx] = pdev->formats[view->pview.format].hw;
523
memcpy(attrib_buf, view->descs.img_attrib_buf, pan_size(ATTRIBUTE_BUFFER) * 2);
525
panvk_fill_image_desc(panvk_desc_ubo_data(set, binding, elem), view);
529
panvk_copy_img_desc(struct panvk_descriptor_set *dst_set,
530
uint32_t dst_binding, uint32_t dst_elem,
531
struct panvk_descriptor_set *src_set,
532
uint32_t src_binding, uint32_t src_elem)
534
unsigned dst_img_idx = panvk_img_idx(dst_set, dst_binding, dst_elem);
535
unsigned src_img_idx = panvk_img_idx(src_set, src_binding, src_elem);
537
void *dst_attrib_buf = (uint8_t *)dst_set->img_attrib_bufs +
538
(pan_size(ATTRIBUTE_BUFFER) * 2 * dst_img_idx);
539
void *src_attrib_buf = (uint8_t *)src_set->img_attrib_bufs +
540
(pan_size(ATTRIBUTE_BUFFER) * 2 * src_img_idx);
542
dst_set->img_fmts[dst_img_idx] = src_set->img_fmts[src_img_idx];
543
memcpy(dst_attrib_buf, src_attrib_buf, pan_size(ATTRIBUTE_BUFFER) * 2);
545
/* Descriptor UBO data gets copied automatically */
549
panvk_write_img_buf_desc(struct panvk_device *dev,
550
struct panvk_descriptor_set *set,
551
uint32_t binding, uint32_t elem,
552
const VkBufferView bufferView)
554
const struct panfrost_device *pdev = &dev->physical_device->pdev;
555
VK_FROM_HANDLE(panvk_buffer_view, view, bufferView);
557
unsigned img_idx = panvk_img_idx(set, binding, elem);
558
void *attrib_buf = (uint8_t *)set->img_attrib_bufs +
559
(pan_size(ATTRIBUTE_BUFFER) * 2 * img_idx);
561
set->img_fmts[img_idx] = pdev->formats[view->fmt].hw;
562
memcpy(attrib_buf, view->descs.img_attrib_buf, pan_size(ATTRIBUTE_BUFFER) * 2);
564
panvk_fill_bview_desc(panvk_desc_ubo_data(set, binding, elem), view);
567
static struct mali_uniform_buffer_packed *
568
panvk_ubo_desc(struct panvk_descriptor_set *set,
569
uint32_t binding, uint32_t elem)
571
const struct panvk_descriptor_set_binding_layout *binding_layout =
572
&set->layout->bindings[binding];
574
unsigned ubo_idx = binding_layout->ubo_idx + elem;
576
return &((struct mali_uniform_buffer_packed *)set->ubos)[ubo_idx];
580
panvk_write_ubo_desc(UNUSED struct panvk_device *dev,
581
struct panvk_descriptor_set *set,
582
uint32_t binding, uint32_t elem,
583
const VkDescriptorBufferInfo *pBufferInfo)
585
VK_FROM_HANDLE(panvk_buffer, buffer, pBufferInfo->buffer);
587
mali_ptr ptr = panvk_buffer_gpu_ptr(buffer, pBufferInfo->offset);
588
size_t size = panvk_buffer_range(buffer, pBufferInfo->offset,
591
panvk_per_arch(emit_ubo)(ptr, size, panvk_ubo_desc(set, binding, elem));
595
panvk_copy_ubo_desc(struct panvk_descriptor_set *dst_set,
596
uint32_t dst_binding, uint32_t dst_elem,
597
struct panvk_descriptor_set *src_set,
598
uint32_t src_binding, uint32_t src_elem)
600
*panvk_ubo_desc(dst_set, dst_binding, dst_elem) =
601
*panvk_ubo_desc(src_set, src_binding, src_elem);
604
static struct panvk_buffer_desc *
605
panvk_dyn_ubo_desc(struct panvk_descriptor_set *set,
606
uint32_t binding, uint32_t elem)
608
const struct panvk_descriptor_set_binding_layout *binding_layout =
609
&set->layout->bindings[binding];
611
return &set->dyn_ubos[binding_layout->dyn_ubo_idx + elem];
615
panvk_write_dyn_ubo_desc(UNUSED struct panvk_device *dev,
616
struct panvk_descriptor_set *set,
617
uint32_t binding, uint32_t elem,
618
const VkDescriptorBufferInfo *pBufferInfo)
620
VK_FROM_HANDLE(panvk_buffer, buffer, pBufferInfo->buffer);
622
*panvk_dyn_ubo_desc(set, binding, elem) = (struct panvk_buffer_desc) {
624
.offset = pBufferInfo->offset,
625
.size = pBufferInfo->range,
630
panvk_copy_dyn_ubo_desc(struct panvk_descriptor_set *dst_set,
631
uint32_t dst_binding, uint32_t dst_elem,
632
struct panvk_descriptor_set *src_set,
633
uint32_t src_binding, uint32_t src_elem)
635
*panvk_dyn_ubo_desc(dst_set, dst_binding, dst_elem) =
636
*panvk_dyn_ubo_desc(src_set, src_binding, src_elem);
640
panvk_write_ssbo_desc(UNUSED struct panvk_device *dev,
641
struct panvk_descriptor_set *set,
642
uint32_t binding, uint32_t elem,
643
const VkDescriptorBufferInfo *pBufferInfo)
645
VK_FROM_HANDLE(panvk_buffer, buffer, pBufferInfo->buffer);
647
struct panvk_ssbo_addr *desc = panvk_desc_ubo_data(set, binding, elem);
648
*desc = (struct panvk_ssbo_addr) {
649
.base_addr = panvk_buffer_gpu_ptr(buffer, pBufferInfo->offset),
650
.size = panvk_buffer_range(buffer, pBufferInfo->offset,
656
panvk_copy_ssbo_desc(struct panvk_descriptor_set *dst_set,
657
uint32_t dst_binding, uint32_t dst_elem,
658
struct panvk_descriptor_set *src_set,
659
uint32_t src_binding, uint32_t src_elem)
661
/* Descriptor UBO data gets copied automatically */
664
static struct panvk_buffer_desc *
665
panvk_dyn_ssbo_desc(struct panvk_descriptor_set *set,
666
uint32_t binding, uint32_t elem)
668
const struct panvk_descriptor_set_binding_layout *binding_layout =
669
&set->layout->bindings[binding];
671
return &set->dyn_ssbos[binding_layout->dyn_ssbo_idx + elem];
675
panvk_write_dyn_ssbo_desc(UNUSED struct panvk_device *dev,
676
struct panvk_descriptor_set *set,
677
uint32_t binding, uint32_t elem,
678
const VkDescriptorBufferInfo *pBufferInfo)
680
VK_FROM_HANDLE(panvk_buffer, buffer, pBufferInfo->buffer);
682
*panvk_dyn_ssbo_desc(set, binding, elem) = (struct panvk_buffer_desc) {
684
.offset = pBufferInfo->offset,
685
.size = pBufferInfo->range,
690
panvk_copy_dyn_ssbo_desc(struct panvk_descriptor_set *dst_set,
691
uint32_t dst_binding, uint32_t dst_elem,
692
struct panvk_descriptor_set *src_set,
693
uint32_t src_binding, uint32_t src_elem)
695
*panvk_dyn_ssbo_desc(dst_set, dst_binding, dst_elem) =
696
*panvk_dyn_ssbo_desc(src_set, src_binding, src_elem);
700
panvk_per_arch(UpdateDescriptorSets)(VkDevice _device,
701
uint32_t descriptorWriteCount,
702
const VkWriteDescriptorSet *pDescriptorWrites,
703
uint32_t descriptorCopyCount,
704
const VkCopyDescriptorSet *pDescriptorCopies)
706
VK_FROM_HANDLE(panvk_device, dev, _device);
708
for (unsigned i = 0; i < descriptorWriteCount; i++) {
709
const VkWriteDescriptorSet *write = &pDescriptorWrites[i];
710
VK_FROM_HANDLE(panvk_descriptor_set, set, write->dstSet);
712
switch (write->descriptorType) {
713
case VK_DESCRIPTOR_TYPE_SAMPLER:
714
for (uint32_t j = 0; j < write->descriptorCount; j++) {
715
panvk_write_sampler_desc(dev, set,
717
write->dstArrayElement + j,
718
&write->pImageInfo[j]);
722
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
723
for (uint32_t j = 0; j < write->descriptorCount; j++) {
724
panvk_write_sampler_desc(dev, set,
726
write->dstArrayElement + j,
727
&write->pImageInfo[j]);
728
panvk_write_tex_desc(dev, set,
730
write->dstArrayElement + j,
731
&write->pImageInfo[j]);
735
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
736
for (uint32_t j = 0; j < write->descriptorCount; j++) {
737
panvk_write_tex_desc(dev, set,
739
write->dstArrayElement + j,
740
&write->pImageInfo[j]);
744
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
745
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
746
for (uint32_t j = 0; j < write->descriptorCount; j++) {
747
panvk_write_img_desc(dev, set,
749
write->dstArrayElement + j,
750
&write->pImageInfo[j]);
754
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
755
for (uint32_t j = 0; j < write->descriptorCount; j++) {
756
panvk_write_tex_buf_desc(dev, set,
758
write->dstArrayElement + j,
759
write->pTexelBufferView[j]);
763
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
764
for (uint32_t j = 0; j < write->descriptorCount; j++) {
765
panvk_write_img_buf_desc(dev, set,
767
write->dstArrayElement + j,
768
write->pTexelBufferView[j]);
772
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
773
for (uint32_t j = 0; j < write->descriptorCount; j++) {
774
panvk_write_ubo_desc(dev, set,
776
write->dstArrayElement + j,
777
&write->pBufferInfo[j]);
781
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
782
for (uint32_t j = 0; j < write->descriptorCount; j++) {
783
panvk_write_dyn_ubo_desc(dev, set,
785
write->dstArrayElement + j,
786
&write->pBufferInfo[j]);
790
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
791
for (uint32_t j = 0; j < write->descriptorCount; j++) {
792
panvk_write_ssbo_desc(dev, set,
794
write->dstArrayElement + j,
795
&write->pBufferInfo[j]);
799
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
800
for (uint32_t j = 0; j < write->descriptorCount; j++) {
801
panvk_write_dyn_ssbo_desc(dev, set,
803
write->dstArrayElement + j,
804
&write->pBufferInfo[j]);
809
unreachable("Unsupported descriptor type");
813
for (unsigned i = 0; i < descriptorCopyCount; i++) {
814
const VkCopyDescriptorSet *copy = &pDescriptorCopies[i];
815
VK_FROM_HANDLE(panvk_descriptor_set, src_set, copy->srcSet);
816
VK_FROM_HANDLE(panvk_descriptor_set, dst_set, copy->dstSet);
818
const struct panvk_descriptor_set_binding_layout *dst_binding_layout =
819
&dst_set->layout->bindings[copy->dstBinding];
820
const struct panvk_descriptor_set_binding_layout *src_binding_layout =
821
&src_set->layout->bindings[copy->srcBinding];
823
assert(dst_binding_layout->type == src_binding_layout->type);
825
if (dst_binding_layout->desc_ubo_stride > 0 &&
826
src_binding_layout->desc_ubo_stride > 0) {
827
for (uint32_t j = 0; j < copy->descriptorCount; j++) {
828
memcpy(panvk_desc_ubo_data(dst_set, copy->dstBinding,
829
copy->dstArrayElement + j),
830
panvk_desc_ubo_data(src_set, copy->srcBinding,
831
copy->srcArrayElement + j),
832
MIN2(dst_binding_layout->desc_ubo_stride,
833
src_binding_layout->desc_ubo_stride));
837
switch (src_binding_layout->type) {
838
case VK_DESCRIPTOR_TYPE_SAMPLER:
839
for (uint32_t j = 0; j < copy->descriptorCount; j++) {
840
panvk_copy_sampler_desc(dst_set, copy->dstBinding,
841
copy->dstArrayElement + j,
842
src_set, copy->srcBinding,
843
copy->srcArrayElement + j);
847
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
848
for (uint32_t j = 0; j < copy->descriptorCount; j++) {
849
panvk_copy_sampler_desc(dst_set, copy->dstBinding,
850
copy->dstArrayElement + j,
851
src_set, copy->srcBinding,
852
copy->srcArrayElement + j);
853
panvk_copy_tex_desc(dst_set, copy->dstBinding,
854
copy->dstArrayElement + j,
855
src_set, copy->srcBinding,
856
copy->srcArrayElement + j);
860
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
861
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
862
for (uint32_t j = 0; j < copy->descriptorCount; j++) {
863
panvk_copy_tex_desc(dst_set, copy->dstBinding,
864
copy->dstArrayElement + j,
865
src_set, copy->srcBinding,
866
copy->srcArrayElement + j);
870
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
871
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
872
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
873
for (uint32_t j = 0; j < copy->descriptorCount; j++) {
874
panvk_copy_img_desc(dst_set, copy->dstBinding,
875
copy->dstArrayElement + j,
876
src_set, copy->srcBinding,
877
copy->srcArrayElement + j);
881
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
882
for (uint32_t j = 0; j < copy->descriptorCount; j++) {
883
panvk_copy_ubo_desc(dst_set, copy->dstBinding,
884
copy->dstArrayElement + j,
885
src_set, copy->srcBinding,
886
copy->srcArrayElement + j);
890
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
891
for (uint32_t j = 0; j < copy->descriptorCount; j++) {
892
panvk_copy_dyn_ubo_desc(dst_set, copy->dstBinding,
893
copy->dstArrayElement + j,
894
src_set, copy->srcBinding,
895
copy->srcArrayElement + j);
899
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
900
for (uint32_t j = 0; j < copy->descriptorCount; j++) {
901
panvk_copy_ssbo_desc(dst_set, copy->dstBinding,
902
copy->dstArrayElement + j,
903
src_set, copy->srcBinding,
904
copy->srcArrayElement + j);
908
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
909
for (uint32_t j = 0; j < copy->descriptorCount; j++) {
910
panvk_copy_dyn_ssbo_desc(dst_set, copy->dstBinding,
911
copy->dstArrayElement + j,
912
src_set, copy->srcBinding,
913
copy->srcArrayElement + j);
918
unreachable("Unsupported descriptor type");