Module: Mesa
Branch: main
Commit: 68a9b3cc6f26c755da584a645dd3a72bd61ea101
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=68a9b3cc6f26c755da584a645dd3a72bd61ea101

Author: Yiwei Zhang <zzyi...@chromium.org>
Date:   Mon Dec 18 20:20:07 2023 -0800

venus: properly ignore formats in VkPipelineRenderingCreateInfo

also remove a redundant trace point and adjust the position for another
to better tell whether fixes have been applied to the pipeline info

Signed-off-by: Yiwei Zhang <zzyi...@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26751>

---

 src/virtio/vulkan/vn_pipeline.c | 126 +++++++++++++++++++++++++++++++---------
 1 file changed, 99 insertions(+), 27 deletions(-)

diff --git a/src/virtio/vulkan/vn_pipeline.c b/src/virtio/vulkan/vn_pipeline.c
index fe7ea7f86eb..ff197625251 100644
--- a/src/virtio/vulkan/vn_pipeline.c
+++ b/src/virtio/vulkan/vn_pipeline.c
@@ -217,6 +217,18 @@ struct vn_graphics_pipeline_fix_tmp {
    VkGraphicsPipelineCreateInfo *infos;
    VkPipelineMultisampleStateCreateInfo *multisample_state_infos;
    VkPipelineViewportStateCreateInfo *viewport_state_infos;
+
+   /* Fixing the pNext chain
+    *
+    * TODO: extend when below or more extensions are supported:
+    * - VK_KHR_maintenance5
+    * - VK_KHR_fragment_shading_rate
+    * - VK_EXT_pipeline_robustness
+    */
+   VkGraphicsPipelineLibraryCreateInfoEXT *gpl_infos;
+   VkPipelineCreationFeedbackCreateInfo *feedback_infos;
+   VkPipelineLibraryCreateInfoKHR *library_infos;
+   VkPipelineRenderingCreateInfo *rendering_infos;
 };
 
 /* shader module commands */
@@ -608,13 +620,20 @@ vn_destroy_failed_pipelines(struct vn_device *dev,
 
 static struct vn_graphics_pipeline_fix_tmp *
 vn_graphics_pipeline_fix_tmp_alloc(const VkAllocationCallbacks *alloc,
-                                   uint32_t info_count)
+                                   uint32_t info_count,
+                                   bool alloc_pnext)
 {
    struct vn_graphics_pipeline_fix_tmp *tmp;
    VkGraphicsPipelineCreateInfo *infos;
    VkPipelineMultisampleStateCreateInfo *multisample_state_infos;
    VkPipelineViewportStateCreateInfo *viewport_state_infos;
 
+   /* for pNext */
+   VkGraphicsPipelineLibraryCreateInfoEXT *gpl_infos;
+   VkPipelineCreationFeedbackCreateInfo *feedback_infos;
+   VkPipelineLibraryCreateInfoKHR *library_infos;
+   VkPipelineRenderingCreateInfo *rendering_infos;
+
    VK_MULTIALLOC(ma);
    vk_multialloc_add(&ma, &tmp, __typeof__(*tmp), 1);
    vk_multialloc_add(&ma, &infos, __typeof__(*infos), info_count);
@@ -623,6 +642,16 @@ vn_graphics_pipeline_fix_tmp_alloc(const 
VkAllocationCallbacks *alloc,
    vk_multialloc_add(&ma, &viewport_state_infos,
                      __typeof__(*viewport_state_infos), info_count);
 
+   if (alloc_pnext) {
+      vk_multialloc_add(&ma, &gpl_infos, __typeof__(*gpl_infos), info_count);
+      vk_multialloc_add(&ma, &feedback_infos, __typeof__(*feedback_infos),
+                        info_count);
+      vk_multialloc_add(&ma, &library_infos, __typeof__(*library_infos),
+                        info_count);
+      vk_multialloc_add(&ma, &rendering_infos, __typeof__(*rendering_infos),
+                        info_count);
+   }
+
    if (!vk_multialloc_zalloc(&ma, alloc, VK_SYSTEM_ALLOCATION_SCOPE_COMMAND))
       return NULL;
 
@@ -630,6 +659,13 @@ vn_graphics_pipeline_fix_tmp_alloc(const 
VkAllocationCallbacks *alloc,
    tmp->multisample_state_infos = multisample_state_infos;
    tmp->viewport_state_infos = viewport_state_infos;
 
+   if (alloc_pnext) {
+      tmp->gpl_infos = gpl_infos;
+      tmp->feedback_infos = feedback_infos;
+      tmp->library_infos = library_infos;
+      tmp->rendering_infos = rendering_infos;
+   }
+
    return tmp;
 }
 
@@ -1315,6 +1351,53 @@ vn_fix_graphics_pipeline_create_info_self(
    }
 }
 
+static void
+vn_graphics_pipeline_create_info_pnext_init(
+   const VkGraphicsPipelineCreateInfo *info,
+   struct vn_graphics_pipeline_fix_tmp *fix_tmp,
+   uint32_t index)
+{
+   VkGraphicsPipelineLibraryCreateInfoEXT *gpl = &fix_tmp->gpl_infos[index];
+   VkPipelineCreationFeedbackCreateInfo *feedback =
+      &fix_tmp->feedback_infos[index];
+   VkPipelineLibraryCreateInfoKHR *library = &fix_tmp->library_infos[index];
+   VkPipelineRenderingCreateInfo *rendering =
+      &fix_tmp->rendering_infos[index];
+
+   VkBaseOutStructure *cur = (void *)&fix_tmp->infos[index];
+
+   vk_foreach_struct_const(src, info->pNext) {
+      void *next = NULL;
+      switch (src->sType) {
+      case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_LIBRARY_CREATE_INFO_EXT:
+         memcpy(gpl, src, sizeof(*gpl));
+         next = gpl;
+         break;
+      case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO:
+         memcpy(feedback, src, sizeof(*feedback));
+         next = feedback;
+         break;
+      case VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR:
+         memcpy(library, src, sizeof(*library));
+         next = library;
+         break;
+      case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO:
+         memcpy(rendering, src, sizeof(*rendering));
+         next = rendering;
+         break;
+      default:
+         break;
+      }
+
+      if (next) {
+         cur->pNext = next;
+         cur = next;
+      }
+   }
+
+   cur->pNext = NULL;
+}
+
 static void
 vn_fix_graphics_pipeline_create_info_pnext(
    const struct vn_graphics_pipeline_info_pnext *ignore,
@@ -1322,21 +1405,13 @@ vn_fix_graphics_pipeline_create_info_pnext(
    struct vn_graphics_pipeline_fix_tmp *fix_tmp,
    uint32_t index)
 {
+   /* initialize pNext chain with allocated tmp storage */
+   vn_graphics_pipeline_create_info_pnext_init(info, fix_tmp, index);
+
    /* VkPipelineRenderingCreateInfo */
    if (ignore->rendering_info_formats) {
-      /* All format fields are invalid, but the only field that must be
-       * erased is pColorAttachmentFormats because the other
-       * fields are merely VkFormat values. Encoding invalid pointers is
-       * unsafe; encoding invalid VkFormat values is not unsafe.
-       *
-       * However, the fix is difficult because it requires a deep
-       * rewrite of the pNext chain.
-       *
-       * TODO: Fix invalid
-       * VkPipelineRenderingCreateInfo::pColorAttachmentFormats.
-       */
-      vn_log(NULL, "venus may encode array from invalid pointer "
-                   "VkPipelineRenderingCreateInfo::pColorAttachmentFormats");
+      fix_tmp->rendering_infos[index].colorAttachmentCount = 0;
+      fix_tmp->rendering_infos[index].pColorAttachmentFormats = NULL;
    }
 }
 
@@ -1349,8 +1424,6 @@ vn_fix_graphics_pipeline_create_infos(
    struct vn_graphics_pipeline_fix_tmp **out_fix_tmp,
    const VkAllocationCallbacks *alloc)
 {
-   VN_TRACE_SCOPE("apply_fixes");
-
    uint32_t self_mask = 0;
    uint32_t pnext_mask = 0;
    for (uint32_t i = 0; i < info_count; i++) {
@@ -1364,8 +1437,11 @@ vn_fix_graphics_pipeline_create_infos(
       return infos;
    }
 
+   /* tell whether fixes are applied in tracing */
+   VN_TRACE_SCOPE("apply_fixes");
+
    struct vn_graphics_pipeline_fix_tmp *fix_tmp =
-      vn_graphics_pipeline_fix_tmp_alloc(alloc, info_count);
+      vn_graphics_pipeline_fix_tmp_alloc(alloc, info_count, pnext_mask);
    if (!fix_tmp)
       return NULL;
 
@@ -1435,18 +1511,14 @@ vn_CreateGraphicsPipelines(VkDevice device,
 
    STACK_ARRAY(struct vn_graphics_pipeline_fix_desc, fix_descs,
                createInfoCount);
-   struct vn_graphics_pipeline_fix_tmp *fix_tmp = NULL;
-
-   {
-      VN_TRACE_SCOPE("fill_states");
-      for (uint32_t i = 0; i < createInfoCount; i++) {
-         struct vn_graphics_pipeline *pipeline =
-            vn_graphics_pipeline_from_handle(pPipelines[i]);
-         vn_graphics_pipeline_state_fill(&pCreateInfos[i], &pipeline->state,
-                                         &fix_descs[i]);
-      }
+   for (uint32_t i = 0; i < createInfoCount; i++) {
+      struct vn_graphics_pipeline *pipeline =
+         vn_graphics_pipeline_from_handle(pPipelines[i]);
+      vn_graphics_pipeline_state_fill(&pCreateInfos[i], &pipeline->state,
+                                      &fix_descs[i]);
    }
 
+   struct vn_graphics_pipeline_fix_tmp *fix_tmp = NULL;
    pCreateInfos = vn_fix_graphics_pipeline_create_infos(
       dev, createInfoCount, pCreateInfos, fix_descs, &fix_tmp, alloc);
    if (!pCreateInfos) {

Reply via email to