summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorameerj <aj662@drexel.edu>2020-07-31 23:30:05 +0200
committerameerj <aj662@drexel.edu>2020-08-16 18:02:22 +0200
commitc02464f64e302b8c9ea0f310e6fd85834d26cca5 (patch)
treeddf37cedd4f779690a677a89770b394905da7196 /src/video_core/renderer_vulkan
parentAddress feedback. Bruteforce delete duplicates (diff)
downloadyuzu-c02464f64e302b8c9ea0f310e6fd85834d26cca5.tar
yuzu-c02464f64e302b8c9ea0f310e6fd85834d26cca5.tar.gz
yuzu-c02464f64e302b8c9ea0f310e6fd85834d26cca5.tar.bz2
yuzu-c02464f64e302b8c9ea0f310e6fd85834d26cca5.tar.lz
yuzu-c02464f64e302b8c9ea0f310e6fd85834d26cca5.tar.xz
yuzu-c02464f64e302b8c9ea0f310e6fd85834d26cca5.tar.zst
yuzu-c02464f64e302b8c9ea0f310e6fd85834d26cca5.zip
Diffstat (limited to 'src/video_core/renderer_vulkan')
-rw-r--r--src/video_core/renderer_vulkan/vk_pipeline_cache.cpp18
-rw-r--r--src/video_core/renderer_vulkan/vk_pipeline_cache.h3
2 files changed, 16 insertions, 5 deletions
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
index a7ce621ca..1a8b2c62b 100644
--- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
@@ -215,11 +215,7 @@ VKGraphicsPipeline* VKPipelineCache::GetGraphicsPipeline(
last_graphics_key = key;
if (device.UseAsynchronousShaders()) {
- auto work = async_shaders.GetCompletedWork();
- for (auto& w : work) {
- auto& entry = graphics_cache.at(w.pipeline->GetCacheKey());
- entry = std::move(w.pipeline);
- }
+ std::unique_lock lock{pipeline_cache};
const auto [pair, is_cache_miss] = graphics_cache.try_emplace(key);
if (is_cache_miss) {
LOG_INFO(Render_Vulkan, "Compile 0x{:016X}", key.Hash());
@@ -296,6 +292,18 @@ VKComputePipeline& VKPipelineCache::GetComputePipeline(const ComputePipelineCach
return *entry;
}
+void VKPipelineCache::EmplacePipeline(std::unique_ptr<VKGraphicsPipeline> pipeline) {
+ std::unique_lock lock{pipeline_cache};
+ const auto [pair, is_cache_miss] = graphics_cache.try_emplace(pipeline->GetCacheKey());
+ auto& entry = pair->second;
+ if (entry) {
+ LOG_INFO(Render_Vulkan, "Pipeline already here 0x{:016X}", pipeline->GetCacheKey().Hash());
+ duplicates.push_back(std::move(pipeline));
+ } else {
+ entry = std::move(pipeline);
+ }
+}
+
void VKPipelineCache::OnShaderRemoval(Shader* shader) {
bool finished = false;
const auto Finish = [&] {
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.h b/src/video_core/renderer_vulkan/vk_pipeline_cache.h
index 404f2b3f7..777ef2038 100644
--- a/src/video_core/renderer_vulkan/vk_pipeline_cache.h
+++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.h
@@ -193,6 +193,8 @@ public:
return renderpass_cache;
}
+ void EmplacePipeline(std::unique_ptr<VKGraphicsPipeline> pipeline);
+
protected:
void OnShaderRemoval(Shader* shader) final;
@@ -216,6 +218,7 @@ private:
VKGraphicsPipeline* last_graphics_pipeline = nullptr;
std::vector<std::unique_ptr<VKGraphicsPipeline>> duplicates;
+ std::mutex pipeline_cache;
std::unordered_map<GraphicsPipelineCacheKey, std::unique_ptr<VKGraphicsPipeline>>
graphics_cache;
std::unordered_map<ComputePipelineCacheKey, std::unique_ptr<VKComputePipeline>> compute_cache;