From e9be86adda4f20c61ea302d44b2fd446901ff7c8 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Sat, 21 Aug 2021 23:44:47 +0000 Subject: [PATCH] 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 Reviewed-by: Chia-I Wu (v1) Reviewed-by: Ryan Neph Part-of: --- 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; } -- 2.34.1