vulkan/meta: Add a get_pipeline_layout helper
authorFaith Ekstrand <faith.ekstrand@collabora.com>
Wed, 26 Jul 2023 21:20:50 +0000 (16:20 -0500)
committerMarge Bot <emma+marge@anholt.net>
Fri, 4 Aug 2023 21:32:06 +0000 (21:32 +0000)
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>

src/vulkan/runtime/vk_meta.c
src/vulkan/runtime/vk_meta.h

index bcdc869..1ea4dc7 100644 (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,
index da085bc..28379b0 100644 (file)
@@ -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,