diff --git a/src/panfrost/vulkan/panvk_descriptor_set.c b/src/panfrost/vulkan/panvk_descriptor_set.c index 7b2eb71e3a6..a152bd5e7e8 100644 --- a/src/panfrost/vulkan/panvk_descriptor_set.c +++ b/src/panfrost/vulkan/panvk_descriptor_set.c @@ -38,144 +38,6 @@ #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) diff --git a/src/panfrost/vulkan/panvk_vX_descriptor_set.c b/src/panfrost/vulkan/panvk_vX_descriptor_set.c index 371e1961c00..f11f8dd040a 100644 --- a/src/panfrost/vulkan/panvk_vX_descriptor_set.c +++ b/src/panfrost/vulkan/panvk_vX_descriptor_set.c @@ -42,6 +42,144 @@ #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,