diff options
author | Faith Ekstrand <faith.ekstrand@collabora.com> | 2023-07-26 16:20:50 -0500 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2023-08-04 21:32:06 +0000 |
commit | 574d6362ca9044937efc3be11f7cdde3b33e57b1 (patch) | |
tree | fd932a7d84196043a5b133771eeca94d280be645 | |
parent | f65fdfcca86acb0d64a5016d4fc922405720b45a (diff) |
vulkan/meta: Add a get_pipeline_layout helper
This helper handles the cache lookup and constructs a pipeline layout
and a descriptor set layout, as needed, all in one go. This saves a bit
of boilerplate in the various meta functions.
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>
-rw-r--r-- | src/vulkan/runtime/vk_meta.c | 55 | ||||
-rw-r--r-- | src/vulkan/runtime/vk_meta.h | 8 |
2 files changed, 63 insertions, 0 deletions
diff --git a/src/vulkan/runtime/vk_meta.c b/src/vulkan/runtime/vk_meta.c index bcdc8690111..1ea4dc77b0e 100644 --- a/src/vulkan/runtime/vk_meta.c +++ b/src/vulkan/runtime/vk_meta.c @@ -243,6 +243,25 @@ vk_meta_create_descriptor_set_layout(struct vk_device *device, return VK_SUCCESS; } +static VkResult +vk_meta_get_descriptor_set_layout(struct vk_device *device, + struct vk_meta_device *meta, + const VkDescriptorSetLayoutCreateInfo *info, + const void *key_data, size_t key_size, + VkDescriptorSetLayout *layout_out) +{ + VkDescriptorSetLayout cached = + vk_meta_lookup_descriptor_set_layout(meta, key_data, key_size); + if (cached != VK_NULL_HANDLE) { + *layout_out = cached; + return VK_SUCCESS; + } + + return vk_meta_create_descriptor_set_layout(device, meta, info, + key_data, key_size, + layout_out); +} + VkResult vk_meta_create_pipeline_layout(struct vk_device *device, struct vk_meta_device *meta, @@ -265,6 +284,42 @@ vk_meta_create_pipeline_layout(struct vk_device *device, return VK_SUCCESS; } +VkResult +vk_meta_get_pipeline_layout(struct vk_device *device, + struct vk_meta_device *meta, + const VkDescriptorSetLayoutCreateInfo *desc_info, + const VkPushConstantRange *push_range, + const void *key_data, size_t key_size, + VkPipelineLayout *layout_out) +{ + VkPipelineLayout cached = + vk_meta_lookup_pipeline_layout(meta, key_data, key_size); + if (cached != VK_NULL_HANDLE) { + *layout_out = cached; + return VK_SUCCESS; + } + + VkDescriptorSetLayout set_layout = VK_NULL_HANDLE; + if (desc_info != NULL) { + VkResult result = + vk_meta_get_descriptor_set_layout(device, meta, desc_info, + key_data, key_size, &set_layout); + if (result != VK_SUCCESS) + return result; + } + + const VkPipelineLayoutCreateInfo layout_info = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, + .setLayoutCount = set_layout != VK_NULL_HANDLE ? 1 : 0, + .pSetLayouts = &set_layout, + .pushConstantRangeCount = push_range != NULL ? 1 : 0, + .pPushConstantRanges = push_range, + }; + + return vk_meta_create_pipeline_layout(device, meta, &layout_info, + key_data, key_size, layout_out); +} + static VkResult create_rect_list_pipeline(struct vk_device *device, struct vk_meta_device *meta, diff --git a/src/vulkan/runtime/vk_meta.h b/src/vulkan/runtime/vk_meta.h index da085bc1ed1..28379b0948d 100644 --- a/src/vulkan/runtime/vk_meta.h +++ b/src/vulkan/runtime/vk_meta.h @@ -152,6 +152,14 @@ vk_meta_create_pipeline_layout(struct vk_device *device, VkPipelineLayout *layout_out); VkResult +vk_meta_get_pipeline_layout(struct vk_device *device, + struct vk_meta_device *meta, + const VkDescriptorSetLayoutCreateInfo *desc_info, + const VkPushConstantRange *push_range, + const void *key_data, size_t key_size, + VkPipelineLayout *layout_out); + +VkResult vk_meta_create_graphics_pipeline(struct vk_device *device, struct vk_meta_device *meta, const VkGraphicsPipelineCreateInfo *info, |