summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFaith Ekstrand <faith.ekstrand@collabora.com>2023-07-26 16:20:50 -0500
committerMarge Bot <emma+marge@anholt.net>2023-08-04 21:32:06 +0000
commit574d6362ca9044937efc3be11f7cdde3b33e57b1 (patch)
treefd932a7d84196043a5b133771eeca94d280be645
parentf65fdfcca86acb0d64a5016d4fc922405720b45a (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.c55
-rw-r--r--src/vulkan/runtime/vk_meta.h8
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,