From 52abe6e921c54d950c9a97cf1ab81cc0011a42bb Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Fri, 2 Feb 2024 10:39:46 +0100 Subject: [PATCH] panvk: Make panvk_descriptor_set per-gen Merge panvk_descriptor_set.c and panvk_vX_descriptor_set.c. Signed-off-by: Boris Brezillon Acked-by: Erik Faye-Lund Reviewed-by: Mary Guillemard Reviewed-by: Rebecca Mckeever Part-of: --- src/panfrost/vulkan/meson.build | 1 - src/panfrost/vulkan/panvk_descriptor_set.c | 153 ------------------ src/panfrost/vulkan/panvk_descriptor_set.h | 4 + src/panfrost/vulkan/panvk_vX_descriptor_set.c | 111 +++++++++++++ 4 files changed, 115 insertions(+), 154 deletions(-) delete mode 100644 src/panfrost/vulkan/panvk_descriptor_set.c diff --git a/src/panfrost/vulkan/meson.build b/src/panfrost/vulkan/meson.build index 8ab7065bb5f..0b6a1a98d28 100644 --- a/src/panfrost/vulkan/meson.build +++ b/src/panfrost/vulkan/meson.build @@ -38,7 +38,6 @@ libpanvk_files = files( 'panvk_buffer.c', 'panvk_cmd_pool.c', 'panvk_device_memory.c', - 'panvk_descriptor_set.c', 'panvk_event.c', 'panvk_image.c', 'panvk_instance.c', diff --git a/src/panfrost/vulkan/panvk_descriptor_set.c b/src/panfrost/vulkan/panvk_descriptor_set.c deleted file mode 100644 index 28e2d466bf9..00000000000 --- a/src/panfrost/vulkan/panvk_descriptor_set.c +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright © 2021 Collabora Ltd. - * - * Derived from: - * Copyright © 2016 Red Hat. - * Copyright © 2016 Bas Nieuwenhuizen - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "panvk_descriptor_set.h" -#include "panvk_device.h" -#include "panvk_entrypoints.h" -#include "panvk_pipeline_layout.h" -#include "panvk_priv_bo.h" - -#include -#include -#include -#include -#include - -#include "vk_alloc.h" -#include "vk_descriptors.h" -#include "vk_log.h" -#include "vk_util.h" - -VKAPI_ATTR VkResult VKAPI_CALL -panvk_CreateDescriptorPool(VkDevice _device, - const VkDescriptorPoolCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, - VkDescriptorPool *pDescriptorPool) -{ - VK_FROM_HANDLE(panvk_device, device, _device); - struct panvk_descriptor_pool *pool; - - pool = vk_object_zalloc(&device->vk, pAllocator, - sizeof(struct panvk_descriptor_pool), - VK_OBJECT_TYPE_DESCRIPTOR_POOL); - if (!pool) - return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); - - pool->max.sets = pCreateInfo->maxSets; - - for (unsigned i = 0; i < pCreateInfo->poolSizeCount; ++i) { - unsigned desc_count = pCreateInfo->pPoolSizes[i].descriptorCount; - - switch (pCreateInfo->pPoolSizes[i].type) { - case VK_DESCRIPTOR_TYPE_SAMPLER: - pool->max.samplers += desc_count; - break; - case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: - pool->max.combined_image_samplers += desc_count; - break; - case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: - pool->max.sampled_images += desc_count; - break; - case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: - pool->max.storage_images += desc_count; - break; - case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: - pool->max.uniform_texel_bufs += desc_count; - break; - case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: - pool->max.storage_texel_bufs += desc_count; - break; - case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: - pool->max.input_attachments += desc_count; - break; - case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: - pool->max.uniform_bufs += desc_count; - break; - case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: - pool->max.storage_bufs += desc_count; - break; - case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: - pool->max.uniform_dyn_bufs += desc_count; - break; - case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: - pool->max.storage_dyn_bufs += desc_count; - break; - default: - unreachable("Invalid descriptor type"); - } - } - - *pDescriptorPool = panvk_descriptor_pool_to_handle(pool); - return VK_SUCCESS; -} - -VKAPI_ATTR void VKAPI_CALL -panvk_DestroyDescriptorPool(VkDevice _device, VkDescriptorPool _pool, - const VkAllocationCallbacks *pAllocator) -{ - VK_FROM_HANDLE(panvk_device, device, _device); - VK_FROM_HANDLE(panvk_descriptor_pool, pool, _pool); - - if (pool) - vk_object_free(&device->vk, pAllocator, pool); -} - -VKAPI_ATTR VkResult VKAPI_CALL -panvk_ResetDescriptorPool(VkDevice _device, VkDescriptorPool _pool, - VkDescriptorPoolResetFlags flags) -{ - VK_FROM_HANDLE(panvk_descriptor_pool, pool, _pool); - memset(&pool->cur, 0, sizeof(pool->cur)); - return VK_SUCCESS; -} - -static void -panvk_descriptor_set_destroy(struct panvk_device *device, - struct panvk_descriptor_pool *pool, - struct panvk_descriptor_set *set) -{ - if (set->desc_bo) - panvk_priv_bo_destroy(set->desc_bo, NULL); - - vk_object_free(&device->vk, NULL, set); -} - -VKAPI_ATTR VkResult VKAPI_CALL -panvk_FreeDescriptorSets(VkDevice _device, VkDescriptorPool descriptorPool, - uint32_t count, const VkDescriptorSet *pDescriptorSets) -{ - VK_FROM_HANDLE(panvk_device, device, _device); - VK_FROM_HANDLE(panvk_descriptor_pool, pool, descriptorPool); - - for (unsigned i = 0; i < count; i++) { - VK_FROM_HANDLE(panvk_descriptor_set, set, pDescriptorSets[i]); - - if (set) - panvk_descriptor_set_destroy(device, pool, set); - } - return VK_SUCCESS; -} diff --git a/src/panfrost/vulkan/panvk_descriptor_set.h b/src/panfrost/vulkan/panvk_descriptor_set.h index 23ef610b822..ad45d58678e 100644 --- a/src/panfrost/vulkan/panvk_descriptor_set.h +++ b/src/panfrost/vulkan/panvk_descriptor_set.h @@ -6,6 +6,10 @@ #ifndef PANVK_DESCRIPTOR_SET_H #define PANVK_DESCRIPTOR_SET_H +#ifndef PAN_ARCH +#error "PAN_ARCH must be defined" +#endif + #include #include "vk_object.h" diff --git a/src/panfrost/vulkan/panvk_vX_descriptor_set.c b/src/panfrost/vulkan/panvk_vX_descriptor_set.c index 8135e22ac4f..17ddb702190 100644 --- a/src/panfrost/vulkan/panvk_vX_descriptor_set.c +++ b/src/panfrost/vulkan/panvk_vX_descriptor_set.c @@ -53,6 +53,117 @@ #include "panvk_descriptor_set_layout.h" #include "panvk_sampler.h" +VKAPI_ATTR VkResult VKAPI_CALL +panvk_per_arch(CreateDescriptorPool)( + VkDevice _device, const VkDescriptorPoolCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) +{ + VK_FROM_HANDLE(panvk_device, device, _device); + struct panvk_descriptor_pool *pool; + + pool = vk_object_zalloc(&device->vk, pAllocator, + sizeof(struct panvk_descriptor_pool), + VK_OBJECT_TYPE_DESCRIPTOR_POOL); + if (!pool) + return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + + pool->max.sets = pCreateInfo->maxSets; + + for (unsigned i = 0; i < pCreateInfo->poolSizeCount; ++i) { + unsigned desc_count = pCreateInfo->pPoolSizes[i].descriptorCount; + + switch (pCreateInfo->pPoolSizes[i].type) { + case VK_DESCRIPTOR_TYPE_SAMPLER: + pool->max.samplers += desc_count; + break; + case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: + pool->max.combined_image_samplers += desc_count; + break; + case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: + pool->max.sampled_images += desc_count; + break; + case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: + pool->max.storage_images += desc_count; + break; + case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: + pool->max.uniform_texel_bufs += desc_count; + break; + case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: + pool->max.storage_texel_bufs += desc_count; + break; + case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: + pool->max.input_attachments += desc_count; + break; + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: + pool->max.uniform_bufs += desc_count; + break; + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: + pool->max.storage_bufs += desc_count; + break; + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: + pool->max.uniform_dyn_bufs += desc_count; + break; + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: + pool->max.storage_dyn_bufs += desc_count; + break; + default: + unreachable("Invalid descriptor type"); + } + } + + *pDescriptorPool = panvk_descriptor_pool_to_handle(pool); + return VK_SUCCESS; +} + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(DestroyDescriptorPool)(VkDevice _device, VkDescriptorPool _pool, + const VkAllocationCallbacks *pAllocator) +{ + VK_FROM_HANDLE(panvk_device, device, _device); + VK_FROM_HANDLE(panvk_descriptor_pool, pool, _pool); + + if (pool) + vk_object_free(&device->vk, pAllocator, pool); +} + +VKAPI_ATTR VkResult VKAPI_CALL +panvk_per_arch(ResetDescriptorPool)(VkDevice _device, VkDescriptorPool _pool, + VkDescriptorPoolResetFlags flags) +{ + VK_FROM_HANDLE(panvk_descriptor_pool, pool, _pool); + memset(&pool->cur, 0, sizeof(pool->cur)); + return VK_SUCCESS; +} + +static void +panvk_descriptor_set_destroy(struct panvk_device *device, + struct panvk_descriptor_pool *pool, + struct panvk_descriptor_set *set) +{ + if (set->desc_bo) + panvk_priv_bo_destroy(set->desc_bo, NULL); + + vk_object_free(&device->vk, NULL, set); +} + +VKAPI_ATTR VkResult VKAPI_CALL +panvk_per_arch(FreeDescriptorSets)(VkDevice _device, + VkDescriptorPool descriptorPool, + uint32_t count, + const VkDescriptorSet *pDescriptorSets) +{ + VK_FROM_HANDLE(panvk_device, device, _device); + VK_FROM_HANDLE(panvk_descriptor_pool, pool, descriptorPool); + + for (unsigned i = 0; i < count; i++) { + VK_FROM_HANDLE(panvk_descriptor_set, set, pDescriptorSets[i]); + + if (set) + panvk_descriptor_set_destroy(device, pool, set); + } + return VK_SUCCESS; +} + static void panvk_fill_bview_desc(struct panvk_bview_desc *desc, struct panvk_buffer_view *view)