From b380f292b47c8b1a3e1711a665a3469074715485 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sat, 24 Jun 2017 19:58:14 +1000 Subject: Vulkan: Reload pipeline cache when relevant host config changes --- Source/Core/VideoBackends/Vulkan/StateTracker.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'Source/Core/VideoBackends/Vulkan/StateTracker.cpp') diff --git a/Source/Core/VideoBackends/Vulkan/StateTracker.cpp b/Source/Core/VideoBackends/Vulkan/StateTracker.cpp index 7299e981a9..01b6065f3c 100644 --- a/Source/Core/VideoBackends/Vulkan/StateTracker.cpp +++ b/Source/Core/VideoBackends/Vulkan/StateTracker.cpp @@ -115,7 +115,20 @@ bool StateTracker::Initialize() return true; } -void StateTracker::LoadPipelineUIDCache() +void StateTracker::InvalidateShaderPointers() +{ + // Clear UIDs, forcing a false match next time. + m_vs_uid = {}; + m_gs_uid = {}; + m_ps_uid = {}; + + // Invalidate shader pointers. + m_pipeline_state.vs = VK_NULL_HANDLE; + m_pipeline_state.gs = VK_NULL_HANDLE; + m_pipeline_state.ps = VK_NULL_HANDLE; +} + +void StateTracker::ReloadPipelineUIDCache() { class PipelineInserter final : public LinearDiskCacheReader { @@ -130,7 +143,8 @@ void StateTracker::LoadPipelineUIDCache() StateTracker* this_ptr; }; - std::string filename = g_object_cache->GetDiskCacheFileName("pipeline-uid"); + // UID caches don't contain any host state, so use a single uid cache per gameid. + std::string filename = g_object_cache->GetDiskCacheFileName("pipeline-uid", true, false); PipelineInserter inserter(this); // OpenAndRead calls Close() first, which will flush all data to disk when reloading. -- cgit v1.2.3 From 7c5bbafdd119e3b8975d7b49411dd89e7770baab Mon Sep 17 00:00:00 2001 From: Stenzek Date: Fri, 30 Jun 2017 14:37:41 +1000 Subject: Vulkan: Don't save/load pipeline UID cache when shader cache is disabled --- Source/Core/VideoBackends/Vulkan/StateTracker.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'Source/Core/VideoBackends/Vulkan/StateTracker.cpp') diff --git a/Source/Core/VideoBackends/Vulkan/StateTracker.cpp b/Source/Core/VideoBackends/Vulkan/StateTracker.cpp index 01b6065f3c..97ad7d4461 100644 --- a/Source/Core/VideoBackends/Vulkan/StateTracker.cpp +++ b/Source/Core/VideoBackends/Vulkan/StateTracker.cpp @@ -143,13 +143,16 @@ void StateTracker::ReloadPipelineUIDCache() StateTracker* this_ptr; }; + m_uid_cache.Sync(); + m_uid_cache.Close(); + // UID caches don't contain any host state, so use a single uid cache per gameid. std::string filename = g_object_cache->GetDiskCacheFileName("pipeline-uid", true, false); - PipelineInserter inserter(this); - - // OpenAndRead calls Close() first, which will flush all data to disk when reloading. - // This assertion must hold true, otherwise data corruption will result. - m_uid_cache.OpenAndRead(filename, inserter); + if (g_ActiveConfig.bShaderCache) + { + PipelineInserter inserter(this); + m_uid_cache.OpenAndRead(filename, inserter); + } } void StateTracker::AppendToPipelineUIDCache(const PipelineInfo& info) @@ -887,7 +890,7 @@ VkPipeline StateTracker::GetPipelineAndCacheUID(const PipelineInfo& info) auto result = g_object_cache->GetPipelineWithCacheResult(info); // Add to the UID cache if it is a new pipeline. - if (!result.second) + if (!result.second && g_ActiveConfig.bShaderCache) AppendToPipelineUIDCache(info); return result.first; -- cgit v1.2.3 From d01b0bf60fba2101e45cfac1e5747edcdbab5fc1 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 19 Jul 2017 20:35:17 +1000 Subject: VideoCommon: Move shader cache filename generation to common --- Source/Core/VideoBackends/Vulkan/StateTracker.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/Vulkan/StateTracker.cpp') diff --git a/Source/Core/VideoBackends/Vulkan/StateTracker.cpp b/Source/Core/VideoBackends/Vulkan/StateTracker.cpp index 97ad7d4461..32ab5b8c86 100644 --- a/Source/Core/VideoBackends/Vulkan/StateTracker.cpp +++ b/Source/Core/VideoBackends/Vulkan/StateTracker.cpp @@ -147,7 +147,8 @@ void StateTracker::ReloadPipelineUIDCache() m_uid_cache.Close(); // UID caches don't contain any host state, so use a single uid cache per gameid. - std::string filename = g_object_cache->GetDiskCacheFileName("pipeline-uid", true, false); + std::string filename = + g_ActiveConfig.GetDiskCacheFileName(APIType::Vulkan, "PipelineUID", true, false); if (g_ActiveConfig.bShaderCache) { PipelineInserter inserter(this); -- cgit v1.2.3 From 3ea9d86faa2544b8c1c235db9456f271baf42fec Mon Sep 17 00:00:00 2001 From: Stenzek Date: Thu, 20 Jul 2017 17:10:02 +1000 Subject: ShaderGen: Pass host config to shader generation functions Also moves the host config checks to common. --- Source/Core/VideoBackends/Vulkan/StateTracker.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'Source/Core/VideoBackends/Vulkan/StateTracker.cpp') diff --git a/Source/Core/VideoBackends/Vulkan/StateTracker.cpp b/Source/Core/VideoBackends/Vulkan/StateTracker.cpp index 32ab5b8c86..0b7833be5c 100644 --- a/Source/Core/VideoBackends/Vulkan/StateTracker.cpp +++ b/Source/Core/VideoBackends/Vulkan/StateTracker.cpp @@ -147,8 +147,7 @@ void StateTracker::ReloadPipelineUIDCache() m_uid_cache.Close(); // UID caches don't contain any host state, so use a single uid cache per gameid. - std::string filename = - g_ActiveConfig.GetDiskCacheFileName(APIType::Vulkan, "PipelineUID", true, false); + std::string filename = GetDiskShaderCacheFileName(APIType::Vulkan, "PipelineUID", true, false); if (g_ActiveConfig.bShaderCache) { PipelineInserter inserter(this); -- cgit v1.2.3