[Vulkan] Add support for vkPipelineCache
This commit is contained in:
@@ -79,6 +79,17 @@ bool VulkanPipelineCache::Initialize() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create Vulkan pipeline cache for faster pipeline creation.
|
||||||
|
VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
|
||||||
|
pipeline_cache_create_info.sType =
|
||||||
|
VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
|
||||||
|
if (vulkan_device->functions().vkCreatePipelineCache(
|
||||||
|
vulkan_device->device(), &pipeline_cache_create_info, nullptr,
|
||||||
|
&vk_pipeline_cache_) != VK_SUCCESS) {
|
||||||
|
XELOGW("VulkanPipelineCache: Failed to create pipeline cache");
|
||||||
|
vk_pipeline_cache_ = VK_NULL_HANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,6 +108,12 @@ void VulkanPipelineCache::Shutdown() {
|
|||||||
}
|
}
|
||||||
pipelines_.clear();
|
pipelines_.clear();
|
||||||
|
|
||||||
|
// Destroy the pipeline cache.
|
||||||
|
if (vk_pipeline_cache_ != VK_NULL_HANDLE) {
|
||||||
|
dfn.vkDestroyPipelineCache(device, vk_pipeline_cache_, nullptr);
|
||||||
|
vk_pipeline_cache_ = VK_NULL_HANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
// Destroy all internal shaders.
|
// Destroy all internal shaders.
|
||||||
ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyShaderModule, device,
|
ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyShaderModule, device,
|
||||||
depth_only_fragment_shader_);
|
depth_only_fragment_shader_);
|
||||||
@@ -2172,7 +2189,7 @@ bool VulkanPipelineCache::EnsurePipelineCreated(
|
|||||||
const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();
|
const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();
|
||||||
const VkDevice device = vulkan_device->device();
|
const VkDevice device = vulkan_device->device();
|
||||||
VkPipeline pipeline;
|
VkPipeline pipeline;
|
||||||
if (dfn.vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1,
|
if (dfn.vkCreateGraphicsPipelines(device, vk_pipeline_cache_, 1,
|
||||||
&pipeline_create_info, nullptr,
|
&pipeline_create_info, nullptr,
|
||||||
&pipeline) != VK_SUCCESS) {
|
&pipeline) != VK_SUCCESS) {
|
||||||
// TODO(Triang3l): Move these error messages outside.
|
// TODO(Triang3l): Move these error messages outside.
|
||||||
|
|||||||
@@ -318,6 +318,9 @@ class VulkanPipelineCache {
|
|||||||
// shader interlock when no Xenos pixel shader provided.
|
// shader interlock when no Xenos pixel shader provided.
|
||||||
VkShaderModule depth_only_fragment_shader_ = VK_NULL_HANDLE;
|
VkShaderModule depth_only_fragment_shader_ = VK_NULL_HANDLE;
|
||||||
|
|
||||||
|
// Vulkan pipeline cache for faster pipeline creation.
|
||||||
|
VkPipelineCache vk_pipeline_cache_ = VK_NULL_HANDLE;
|
||||||
|
|
||||||
std::unordered_map<PipelineDescription, Pipeline, PipelineDescription::Hasher>
|
std::unordered_map<PipelineDescription, Pipeline, PipelineDescription::Hasher>
|
||||||
pipelines_;
|
pipelines_;
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ XE_UI_VULKAN_FUNCTION(vkCreateFramebuffer)
|
|||||||
XE_UI_VULKAN_FUNCTION(vkCreateGraphicsPipelines)
|
XE_UI_VULKAN_FUNCTION(vkCreateGraphicsPipelines)
|
||||||
XE_UI_VULKAN_FUNCTION(vkCreateImage)
|
XE_UI_VULKAN_FUNCTION(vkCreateImage)
|
||||||
XE_UI_VULKAN_FUNCTION(vkCreateImageView)
|
XE_UI_VULKAN_FUNCTION(vkCreateImageView)
|
||||||
|
XE_UI_VULKAN_FUNCTION(vkCreatePipelineCache)
|
||||||
XE_UI_VULKAN_FUNCTION(vkCreatePipelineLayout)
|
XE_UI_VULKAN_FUNCTION(vkCreatePipelineLayout)
|
||||||
XE_UI_VULKAN_FUNCTION(vkCreateRenderPass)
|
XE_UI_VULKAN_FUNCTION(vkCreateRenderPass)
|
||||||
XE_UI_VULKAN_FUNCTION(vkCreateSampler)
|
XE_UI_VULKAN_FUNCTION(vkCreateSampler)
|
||||||
@@ -54,6 +55,7 @@ XE_UI_VULKAN_FUNCTION(vkDestroyFramebuffer)
|
|||||||
XE_UI_VULKAN_FUNCTION(vkDestroyImage)
|
XE_UI_VULKAN_FUNCTION(vkDestroyImage)
|
||||||
XE_UI_VULKAN_FUNCTION(vkDestroyImageView)
|
XE_UI_VULKAN_FUNCTION(vkDestroyImageView)
|
||||||
XE_UI_VULKAN_FUNCTION(vkDestroyPipeline)
|
XE_UI_VULKAN_FUNCTION(vkDestroyPipeline)
|
||||||
|
XE_UI_VULKAN_FUNCTION(vkDestroyPipelineCache)
|
||||||
XE_UI_VULKAN_FUNCTION(vkDestroyPipelineLayout)
|
XE_UI_VULKAN_FUNCTION(vkDestroyPipelineLayout)
|
||||||
XE_UI_VULKAN_FUNCTION(vkDestroyRenderPass)
|
XE_UI_VULKAN_FUNCTION(vkDestroyRenderPass)
|
||||||
XE_UI_VULKAN_FUNCTION(vkDestroySampler)
|
XE_UI_VULKAN_FUNCTION(vkDestroySampler)
|
||||||
|
|||||||
Reference in New Issue
Block a user