From 3c24f19fa541b6e84b51f6bb8dde617913bd8db8 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 28 Jan 2022 13:02:56 -0600 Subject: [PATCH] vulkan/runtime: Add a comon vk_descriptor_update_template We can't actually make the template-based update common efficiently but we can save everyone a bit of typing by having a common struct. This is mostly a direct copy+paste from ANV with a type field added and a couple comments tweaked. Reviewed-by: Boris Brezillon Acked-by: Caio Oliveira Part-of: --- src/vulkan/runtime/meson.build | 2 + .../runtime/vk_descriptor_update_template.c | 87 ++++++++++++++++++ .../runtime/vk_descriptor_update_template.h | 90 +++++++++++++++++++ 3 files changed, 179 insertions(+) create mode 100644 src/vulkan/runtime/vk_descriptor_update_template.c create mode 100644 src/vulkan/runtime/vk_descriptor_update_template.h diff --git a/src/vulkan/runtime/meson.build b/src/vulkan/runtime/meson.build index 54b389d8c1d..5f3cf8c730e 100644 --- a/src/vulkan/runtime/meson.build +++ b/src/vulkan/runtime/meson.build @@ -42,6 +42,8 @@ vulkan_runtime_files = files( 'vk_descriptor_set_layout.h', 'vk_descriptors.c', 'vk_descriptors.h', + 'vk_descriptor_update_template.c', + 'vk_descriptor_update_template.h', 'vk_device.c', 'vk_device.h', 'vk_fence.c', diff --git a/src/vulkan/runtime/vk_descriptor_update_template.c b/src/vulkan/runtime/vk_descriptor_update_template.c new file mode 100644 index 00000000000..aaa0b336efe --- /dev/null +++ b/src/vulkan/runtime/vk_descriptor_update_template.c @@ -0,0 +1,87 @@ +/* + * Copyright © 2017 Intel Corporation + * Copyright © 2022 Collabora, Ltd + * + * 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 "vk_descriptor_update_template.h" + +#include "vk_common_entrypoints.h" +#include "vk_device.h" +#include "vk_log.h" + +VKAPI_ATTR VkResult VKAPI_CALL +vk_common_CreateDescriptorUpdateTemplate(VkDevice _device, + const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate) +{ + VK_FROM_HANDLE(vk_device, device, _device); + struct vk_descriptor_update_template *template; + + size_t size = sizeof(*template) + + pCreateInfo->descriptorUpdateEntryCount * sizeof(template->entries[0]); + template = vk_object_alloc(device, pAllocator, size, + VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE); + if (template == NULL) + return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + + template->type = pCreateInfo->templateType; + template->bind_point = pCreateInfo->pipelineBindPoint; + + if (template->type == VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET) + template->set = pCreateInfo->set; + + template->entry_count = pCreateInfo->descriptorUpdateEntryCount; + for (uint32_t i = 0; i < template->entry_count; i++) { + const VkDescriptorUpdateTemplateEntry *pEntry = + &pCreateInfo->pDescriptorUpdateEntries[i]; + + template->entries[i] = (struct vk_descriptor_template_entry) { + .type = pEntry->descriptorType, + .binding = pEntry->dstBinding, + .array_element = pEntry->dstArrayElement, + .array_count = pEntry->descriptorCount, + .offset = pEntry->offset, + .stride = pEntry->stride, + }; + } + + *pDescriptorUpdateTemplate = + vk_descriptor_update_template_to_handle(template); + + return VK_SUCCESS; +} + +VKAPI_ATTR void VKAPI_CALL +vk_common_DestroyDescriptorUpdateTemplate(VkDevice _device, + VkDescriptorUpdateTemplate descriptorUpdateTemplate, + const VkAllocationCallbacks *pAllocator) +{ + VK_FROM_HANDLE(vk_device, device, _device); + VK_FROM_HANDLE(vk_descriptor_update_template, template, + descriptorUpdateTemplate); + + if (!template) + return; + + vk_object_free(device, pAllocator, template); +} diff --git a/src/vulkan/runtime/vk_descriptor_update_template.h b/src/vulkan/runtime/vk_descriptor_update_template.h new file mode 100644 index 00000000000..ee4ccdf3006 --- /dev/null +++ b/src/vulkan/runtime/vk_descriptor_update_template.h @@ -0,0 +1,90 @@ +/* + * Copyright © 2017 Intel Corporation + * Copyright © 2022 Collabora, Ltd + * + * 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. + */ +#ifndef VK_DESCRIPTOR_UPDATE_TEMPLATE_H +#define VK_DESCRIPTOR_UPDATE_TEMPLATE_H + +#include "vk_object.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct vk_descriptor_template_entry { + /** VkDescriptorUpdateTemplateEntry::descriptorType */ + VkDescriptorType type; + + /** VkDescriptorUpdateTemplateEntry::dstBinding */ + uint32_t binding; + + /** VkDescriptorUpdateTemplateEntry::dstArrayElement */ + uint32_t array_element; + + /** VkDescriptorUpdateTemplateEntry::descriptorCount */ + uint32_t array_count; + + /** VkDescriptorUpdateTemplateEntry::offset + * + * Offset into the user provided data */ + size_t offset; + + /** VkDescriptorUpdateTemplateEntry::stride + * + * Stride between elements into the user provided data + */ + size_t stride; +}; + +struct vk_descriptor_update_template { + struct vk_object_base base; + + /** VkDescriptorUpdateTemplateCreateInfo::templateType */ + VkDescriptorUpdateTemplateType type; + + /** VkDescriptorUpdateTemplateCreateInfo::pipelineBindPoint */ + VkPipelineBindPoint bind_point; + + /** VkDescriptorUpdateTemplateCreateInfo::set + * + * The descriptor set this template corresponds to. This value is only + * valid if the template was created with the templateType + * VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET. + */ + uint8_t set; + + /** VkDescriptorUpdateTemplateCreateInfo::descriptorUpdateEntryCount */ + uint32_t entry_count; + + /** Entries of the template */ + struct vk_descriptor_template_entry entries[0]; +}; + +VK_DEFINE_NONDISP_HANDLE_CASTS(vk_descriptor_update_template, base, + VkDescriptorUpdateTemplate, + VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE) + +#ifdef __cplusplus +} +#endif + +#endif /* VK_DESCRIPTOR_UPDATE_TEMPLATE_H */