From 60199c032324b0cd12528684172618fec6dde28b Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Tue, 12 May 2026 00:27:52 +0800 Subject: [PATCH] [Optimization] (MG_Backend/DirectVulkan): optimize CreatePipeline hot path with VkPipelineCache --- .../DirectVulkan/Renderer/PipelineFactory.cpp | 15 ++++++++++++++- .../DirectVulkan/Renderer/PipelineFactory.h | 4 ++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/PipelineFactory.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/PipelineFactory.cpp index 7c58f70d..e5fd2fbd 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/PipelineFactory.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/PipelineFactory.cpp @@ -9,8 +9,21 @@ #include "PipelineFactory.h" namespace MobileGL::MG_Backend::DirectVulkan { + PipelineFactory::PipelineFactory(VkDevice device, const VulkanRendererConfig& config): + m_device(device), m_config(config) { + MOBILEGL_ASSERT(m_device != VK_NULL_HANDLE, "PipelineFactory: device is null"); + + VkPipelineCacheCreateInfo pipelineCacheInfo{VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO}; + VK_VERIFY(vkCreatePipelineCache(m_device, &pipelineCacheInfo, nullptr, &m_pipelineCache), + "vkCreatePipelineCache"); + } + PipelineFactory::~PipelineFactory() { DestroyAll(); + if (m_pipelineCache != VK_NULL_HANDLE) { + vkDestroyPipelineCache(m_device, m_pipelineCache, nullptr); + m_pipelineCache = VK_NULL_HANDLE; + } } PipelineFactory::HashType PipelineFactory::ComputeHash(const PipelineCreatePayload& payload) const { @@ -128,7 +141,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { gpi.subpass = payload.subpass; VkPipeline pipeline = VK_NULL_HANDLE; - VK_VERIFY(vkCreateGraphicsPipelines(m_device, VK_NULL_HANDLE, 1, &gpi, nullptr, &pipeline), + VK_VERIFY(vkCreateGraphicsPipelines(m_device, m_pipelineCache, 1, &gpi, nullptr, &pipeline), "vkCreateGraphicsPipelines"); return pipeline; } diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/PipelineFactory.h b/MobileGL/MG_Backend/DirectVulkan/Renderer/PipelineFactory.h index 6c3d41fb..ae9faea6 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/PipelineFactory.h +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/PipelineFactory.h @@ -38,8 +38,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { const VkPipelineVertexInputStateCreateInfo* vertexInputState = nullptr; }; - explicit PipelineFactory(VkDevice device, const VulkanRendererConfig& config): - m_device(device), m_config(config) {} + explicit PipelineFactory(VkDevice device, const VulkanRendererConfig& config); ~PipelineFactory(); PipelineFactory(const PipelineFactory&) = delete; @@ -52,6 +51,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { VkDevice m_device = VK_NULL_HANDLE; const VulkanRendererConfig& m_config; + VkPipelineCache m_pipelineCache = VK_NULL_HANDLE; UnorderedMap m_cache; static inline XXH64_state_t* m_hashState = XXH64_createState(); };