#include "pan_bo.h"
-VkResult
-panvk_CreateDescriptorSetLayout(VkDevice _device,
- const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
- const VkAllocationCallbacks *pAllocator,
- VkDescriptorSetLayout *pSetLayout)
-{
- VK_FROM_HANDLE(panvk_device, device, _device);
- struct panvk_descriptor_set_layout *set_layout;
- VkDescriptorSetLayoutBinding *bindings = NULL;
- unsigned num_bindings = 0;
- VkResult result;
-
- if (pCreateInfo->bindingCount) {
- result =
- vk_create_sorted_bindings(pCreateInfo->pBindings,
- pCreateInfo->bindingCount,
- &bindings);
- if (result != VK_SUCCESS)
- return vk_error(device, result);
-
- num_bindings = bindings[pCreateInfo->bindingCount - 1].binding + 1;
- }
-
- unsigned num_immutable_samplers = 0;
- for (unsigned i = 0; i < pCreateInfo->bindingCount; i++) {
- if (bindings[i].pImmutableSamplers)
- num_immutable_samplers += bindings[i].descriptorCount;
- }
-
- size_t size = sizeof(*set_layout) +
- (sizeof(struct panvk_descriptor_set_binding_layout) *
- num_bindings) +
- (sizeof(struct panvk_sampler *) * num_immutable_samplers);
- set_layout = vk_object_zalloc(&device->vk, NULL, size,
- VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT);
- if (!set_layout) {
- result = VK_ERROR_OUT_OF_HOST_MEMORY;
- goto err_free_bindings;
- }
-
- struct panvk_sampler **immutable_samplers =
- (struct panvk_sampler **)((uint8_t *)set_layout + sizeof(*set_layout) +
- (sizeof(struct panvk_descriptor_set_binding_layout) *
- num_bindings));
-
- set_layout->flags = pCreateInfo->flags;
- set_layout->binding_count = num_bindings;
-
- unsigned sampler_idx = 0, tex_idx = 0, ubo_idx = 0, ssbo_idx = 0;
- unsigned dyn_ubo_idx = 0, dyn_ssbo_idx = 0, desc_idx = 0, img_idx = 0;
-
- for (unsigned i = 0; i < pCreateInfo->bindingCount; i++) {
- const VkDescriptorSetLayoutBinding *binding = &bindings[i];
- struct panvk_descriptor_set_binding_layout *binding_layout =
- &set_layout->bindings[binding->binding];
-
- binding_layout->type = binding->descriptorType;
- binding_layout->array_size = binding->descriptorCount;
- binding_layout->shader_stages = binding->stageFlags;
- if (binding->pImmutableSamplers) {
- binding_layout->immutable_samplers = immutable_samplers;
- immutable_samplers += binding_layout->array_size;
- for (unsigned j = 0; j < binding_layout->array_size; j++) {
- VK_FROM_HANDLE(panvk_sampler, sampler, binding->pImmutableSamplers[j]);
- binding_layout->immutable_samplers[j] = sampler;
- }
- }
-
- binding_layout->desc_idx = desc_idx;
- desc_idx += binding->descriptorCount;
- switch (binding_layout->type) {
- case VK_DESCRIPTOR_TYPE_SAMPLER:
- binding_layout->sampler_idx = sampler_idx;
- sampler_idx += binding_layout->array_size;
- break;
- case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
- binding_layout->sampler_idx = sampler_idx;
- binding_layout->tex_idx = tex_idx;
- sampler_idx += binding_layout->array_size;
- tex_idx += binding_layout->array_size;
- break;
- case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
- case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
- binding_layout->tex_idx = tex_idx;
- tex_idx += binding_layout->array_size;
- break;
- case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
- binding_layout->tex_idx = tex_idx;
- tex_idx += binding_layout->array_size;
- break;
- case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
- binding_layout->dyn_ubo_idx = dyn_ubo_idx;
- dyn_ubo_idx += binding_layout->array_size;
- break;
- case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
- binding_layout->ubo_idx = ubo_idx;
- ubo_idx += binding_layout->array_size;
- break;
- case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
- binding_layout->dyn_ssbo_idx = dyn_ssbo_idx;
- dyn_ssbo_idx += binding_layout->array_size;
- break;
- case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
- binding_layout->ssbo_idx = ssbo_idx;
- ssbo_idx += binding_layout->array_size;
- break;
- case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
- binding_layout->img_idx = img_idx;
- img_idx += binding_layout->array_size;
- break;
- case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
- binding_layout->img_idx = img_idx;
- img_idx += binding_layout->array_size;
- break;
- default:
- unreachable("Invalid descriptor type");
- }
- }
-
- set_layout->num_descs = desc_idx;
- set_layout->num_samplers = sampler_idx;
- set_layout->num_textures = tex_idx;
- set_layout->num_ubos = ubo_idx;
- set_layout->num_dyn_ubos = dyn_ubo_idx;
- set_layout->num_ssbos = ssbo_idx;
- set_layout->num_dyn_ssbos = dyn_ssbo_idx;
- set_layout->num_imgs = img_idx;
- p_atomic_set(&set_layout->refcount, 1);
-
- free(bindings);
- *pSetLayout = panvk_descriptor_set_layout_to_handle(set_layout);
- return VK_SUCCESS;
-
-err_free_bindings:
- free(bindings);
- return vk_error(device, result);
-}
-
void
panvk_descriptor_set_layout_destroy(struct panvk_device *device,
struct panvk_descriptor_set_layout *layout)
#include "pan_bo.h"
#include "panvk_cs.h"
+VkResult
+panvk_per_arch(CreateDescriptorSetLayout)(VkDevice _device,
+ const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
+ const VkAllocationCallbacks *pAllocator,
+ VkDescriptorSetLayout *pSetLayout)
+{
+ VK_FROM_HANDLE(panvk_device, device, _device);
+ struct panvk_descriptor_set_layout *set_layout;
+ VkDescriptorSetLayoutBinding *bindings = NULL;
+ unsigned num_bindings = 0;
+ VkResult result;
+
+ if (pCreateInfo->bindingCount) {
+ result =
+ vk_create_sorted_bindings(pCreateInfo->pBindings,
+ pCreateInfo->bindingCount,
+ &bindings);
+ if (result != VK_SUCCESS)
+ return vk_error(device, result);
+
+ num_bindings = bindings[pCreateInfo->bindingCount - 1].binding + 1;
+ }
+
+ unsigned num_immutable_samplers = 0;
+ for (unsigned i = 0; i < pCreateInfo->bindingCount; i++) {
+ if (bindings[i].pImmutableSamplers)
+ num_immutable_samplers += bindings[i].descriptorCount;
+ }
+
+ size_t size = sizeof(*set_layout) +
+ (sizeof(struct panvk_descriptor_set_binding_layout) *
+ num_bindings) +
+ (sizeof(struct panvk_sampler *) * num_immutable_samplers);
+ set_layout = vk_object_zalloc(&device->vk, NULL, size,
+ VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT);
+ if (!set_layout) {
+ result = VK_ERROR_OUT_OF_HOST_MEMORY;
+ goto err_free_bindings;
+ }
+
+ struct panvk_sampler **immutable_samplers =
+ (struct panvk_sampler **)((uint8_t *)set_layout + sizeof(*set_layout) +
+ (sizeof(struct panvk_descriptor_set_binding_layout) *
+ num_bindings));
+
+ set_layout->flags = pCreateInfo->flags;
+ set_layout->binding_count = num_bindings;
+
+ unsigned sampler_idx = 0, tex_idx = 0, ubo_idx = 0, ssbo_idx = 0;
+ unsigned dyn_ubo_idx = 0, dyn_ssbo_idx = 0, desc_idx = 0, img_idx = 0;
+
+ for (unsigned i = 0; i < pCreateInfo->bindingCount; i++) {
+ const VkDescriptorSetLayoutBinding *binding = &bindings[i];
+ struct panvk_descriptor_set_binding_layout *binding_layout =
+ &set_layout->bindings[binding->binding];
+
+ binding_layout->type = binding->descriptorType;
+ binding_layout->array_size = binding->descriptorCount;
+ binding_layout->shader_stages = binding->stageFlags;
+ if (binding->pImmutableSamplers) {
+ binding_layout->immutable_samplers = immutable_samplers;
+ immutable_samplers += binding_layout->array_size;
+ for (unsigned j = 0; j < binding_layout->array_size; j++) {
+ VK_FROM_HANDLE(panvk_sampler, sampler, binding->pImmutableSamplers[j]);
+ binding_layout->immutable_samplers[j] = sampler;
+ }
+ }
+
+ binding_layout->desc_idx = desc_idx;
+ desc_idx += binding->descriptorCount;
+ switch (binding_layout->type) {
+ case VK_DESCRIPTOR_TYPE_SAMPLER:
+ binding_layout->sampler_idx = sampler_idx;
+ sampler_idx += binding_layout->array_size;
+ break;
+ case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
+ binding_layout->sampler_idx = sampler_idx;
+ binding_layout->tex_idx = tex_idx;
+ sampler_idx += binding_layout->array_size;
+ tex_idx += binding_layout->array_size;
+ break;
+ case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
+ case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
+ binding_layout->tex_idx = tex_idx;
+ tex_idx += binding_layout->array_size;
+ break;
+ case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
+ binding_layout->tex_idx = tex_idx;
+ tex_idx += binding_layout->array_size;
+ break;
+ case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
+ binding_layout->dyn_ubo_idx = dyn_ubo_idx;
+ dyn_ubo_idx += binding_layout->array_size;
+ break;
+ case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
+ binding_layout->ubo_idx = ubo_idx;
+ ubo_idx += binding_layout->array_size;
+ break;
+ case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
+ binding_layout->dyn_ssbo_idx = dyn_ssbo_idx;
+ dyn_ssbo_idx += binding_layout->array_size;
+ break;
+ case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
+ binding_layout->ssbo_idx = ssbo_idx;
+ ssbo_idx += binding_layout->array_size;
+ break;
+ case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
+ binding_layout->img_idx = img_idx;
+ img_idx += binding_layout->array_size;
+ break;
+ case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
+ binding_layout->img_idx = img_idx;
+ img_idx += binding_layout->array_size;
+ break;
+ default:
+ unreachable("Invalid descriptor type");
+ }
+ }
+
+ set_layout->num_descs = desc_idx;
+ set_layout->num_samplers = sampler_idx;
+ set_layout->num_textures = tex_idx;
+ set_layout->num_ubos = ubo_idx;
+ set_layout->num_dyn_ubos = dyn_ubo_idx;
+ set_layout->num_ssbos = ssbo_idx;
+ set_layout->num_dyn_ssbos = dyn_ssbo_idx;
+ set_layout->num_imgs = img_idx;
+ p_atomic_set(&set_layout->refcount, 1);
+
+ free(bindings);
+ *pSetLayout = panvk_descriptor_set_layout_to_handle(set_layout);
+ return VK_SUCCESS;
+
+err_free_bindings:
+ free(bindings);
+ return vk_error(device, result);
+}
+
static VkResult
panvk_per_arch(descriptor_set_create)(struct panvk_device *device,
struct panvk_descriptor_pool *pool,