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>
This commit is contained in:
Faith Ekstrand 2023-07-26 16:20:50 -05:00 committed by Marge Bot
parent f65fdfcca8
commit 574d6362ca
2 changed files with 63 additions and 0 deletions

View file

@ -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,

View file

@ -151,6 +151,14 @@ vk_meta_create_pipeline_layout(struct vk_device *device,
const void *key_data, size_t key_size,
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,