Mesa (main): venus: scrub ignored fields of pipeline info when rasterization is disable

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Aug 23 20:10:24 UTC 2021


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

Author: Yiwei Zhang <zzyiwei at chromium.org>
Date:   Sat Aug 21 23:44:47 2021 +0000

venus: scrub ignored fields of pipeline info when rasterization is disable

v2: use vk_alloc instead of vk_zalloc because of full memcpy

Signed-off-by: Yiwei Zhang <zzyiwei at chromium.org>
Reviewed-by: Chia-I Wu <olvaffe at gmail.com> (v1)
Reviewed-by: Ryan Neph <ryanneph at google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12499>

---

 src/virtio/vulkan/vn_pipeline.c | 62 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 62 insertions(+)

diff --git a/src/virtio/vulkan/vn_pipeline.c b/src/virtio/vulkan/vn_pipeline.c
index c7c5a3cef6e..5fbab8a4a2b 100644
--- a/src/virtio/vulkan/vn_pipeline.c
+++ b/src/virtio/vulkan/vn_pipeline.c
@@ -238,6 +238,55 @@ vn_MergePipelineCaches(VkDevice device,
 
 /* pipeline commands */
 
+static const VkGraphicsPipelineCreateInfo *
+vn_fix_graphics_pipeline_create_info(
+   struct vn_device *dev,
+   uint32_t create_info_count,
+   const VkGraphicsPipelineCreateInfo *create_infos,
+   const VkAllocationCallbacks *alloc,
+   VkGraphicsPipelineCreateInfo **out)
+{
+   VkGraphicsPipelineCreateInfo *infos = NULL;
+   bool has_ignored_state = false;
+
+   for (uint32_t i = 0; i < create_info_count; i++) {
+      if (create_infos[i].pRasterizationState->rasterizerDiscardEnable ==
+          VK_FALSE)
+         continue;
+
+      if (create_infos[i].pViewportState ||
+          create_infos[i].pMultisampleState ||
+          create_infos[i].pDepthStencilState ||
+          create_infos[i].pColorBlendState) {
+         has_ignored_state = true;
+         break;
+      }
+   }
+
+   if (!has_ignored_state)
+      return create_infos;
+
+   infos = vk_alloc(alloc, sizeof(*infos) * create_info_count,
+                    VN_DEFAULT_ALIGN, VK_SYSTEM_ALLOCATION_SCOPE_COMMAND);
+   if (!infos)
+      return NULL;
+
+   memcpy(infos, create_infos, sizeof(*infos) * create_info_count);
+
+   for (uint32_t i = 0; i < create_info_count; i++) {
+      if (infos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)
+         continue;
+
+      infos[i].pViewportState = NULL;
+      infos[i].pMultisampleState = NULL;
+      infos[i].pDepthStencilState = NULL;
+      infos[i].pColorBlendState = NULL;
+   }
+
+   *out = infos;
+   return infos;
+}
+
 VkResult
 vn_CreateGraphicsPipelines(VkDevice device,
                            VkPipelineCache pipelineCache,
@@ -249,6 +298,12 @@ vn_CreateGraphicsPipelines(VkDevice device,
    struct vn_device *dev = vn_device_from_handle(device);
    const VkAllocationCallbacks *alloc =
       pAllocator ? pAllocator : &dev->base.base.alloc;
+   VkGraphicsPipelineCreateInfo *local_infos = NULL;
+
+   pCreateInfos = vn_fix_graphics_pipeline_create_info(
+      dev, createInfoCount, pCreateInfos, alloc, &local_infos);
+   if (!pCreateInfos)
+      return vn_error(dev->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
 
    for (uint32_t i = 0; i < createInfoCount; i++) {
       struct vn_pipeline *pipeline =
@@ -257,6 +312,10 @@ vn_CreateGraphicsPipelines(VkDevice device,
       if (!pipeline) {
          for (uint32_t j = 0; j < i; j++)
             vk_free(alloc, vn_pipeline_from_handle(pPipelines[j]));
+
+         if (local_infos)
+            vk_free(alloc, local_infos);
+
          memset(pPipelines, 0, sizeof(*pPipelines) * createInfoCount);
          return vn_error(dev->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
       }
@@ -272,6 +331,9 @@ vn_CreateGraphicsPipelines(VkDevice device,
                                       createInfoCount, pCreateInfos, NULL,
                                       pPipelines);
 
+   if (local_infos)
+      vk_free(alloc, local_infos);
+
    return VK_SUCCESS;
 }
 



More information about the mesa-commit mailing list