diff options
Diffstat (limited to 'src/video_core/shader_cache.cpp')
| -rw-r--r-- | src/video_core/shader_cache.cpp | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/src/video_core/shader_cache.cpp b/src/video_core/shader_cache.cpp index 2af32c8f25..8a349bfe2a 100644 --- a/src/video_core/shader_cache.cpp +++ b/src/video_core/shader_cache.cpp @@ -1,9 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include <algorithm> #include <array> #include <vector> +#include <boost/container/small_vector.hpp> #include "common/assert.h" #include "shader_recompiler/frontend/maxwell/control_flow.h" @@ -16,6 +20,7 @@ #include "video_core/memory_manager.h" #include "video_core/shader_cache.h" #include "video_core/shader_environment.h" +#include "video_core/texture_cache/util.h" namespace VideoCommon { @@ -157,21 +162,22 @@ void ShaderCache::RemovePendingShaders() { std::ranges::sort(marked_for_removal); marked_for_removal.erase(std::unique(marked_for_removal.begin(), marked_for_removal.end()), marked_for_removal.end()); - + // Linear growth anyways - maybe consider static_vector instead? boost::container::small_vector<ShaderInfo*, 16> removed_shaders; - std::scoped_lock lock{lookup_mutex}; for (Entry* const entry : marked_for_removal) { removed_shaders.push_back(entry->data); - - const auto it = lookup_cache.find(entry->addr_start); + auto const it = lookup_cache.find(entry->addr_start); ASSERT(it != lookup_cache.end()); lookup_cache.erase(it); } marked_for_removal.clear(); if (!removed_shaders.empty()) { - RemoveShadersFromStorage(removed_shaders); + // Remove the given shaders from the cache + std::erase_if(storage, [&removed_shaders](const std::unique_ptr<ShaderInfo>& shader) { + return std::ranges::find(removed_shaders, shader.get()) != removed_shaders.end(); + }); } } @@ -214,13 +220,6 @@ void ShaderCache::UnmarkMemory(Entry* entry) { device_memory.UpdatePagesCachedCount(addr, size, -1); } -void ShaderCache::RemoveShadersFromStorage(std::span<ShaderInfo*> removed_shaders) { - // Remove them from the cache - std::erase_if(storage, [&removed_shaders](const std::unique_ptr<ShaderInfo>& shader) { - return std::ranges::find(removed_shaders, shader.get()) != removed_shaders.end(); - }); -} - ShaderCache::Entry* ShaderCache::NewEntry(VAddr addr, VAddr addr_end, ShaderInfo* data) { auto entry = std::make_unique<Entry>(Entry{addr, addr_end, data}); Entry* const entry_pointer = entry.get(); |
