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