aboutsummaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
authorlizzie <lizzie@eden-emu.dev>2026-02-10 03:34:07 +0100
committercrueter <crueter@eden-emu.dev>2026-02-10 03:34:07 +0100
commita8093c2a3cf98ccccabeb1d6a2c1ccc5e191557f (patch)
treed967e61fe889c2c39aa9e3b751927ffa25f1a19e /src/video_core
parent0f8b35c4cd0f8d09b38edc52b006472cd98540fc (diff)
[*] change all std::unordered_map and std::unordered_set into ankerl::unordered_dense::map/set variants (#3442)
mainly doing this to reduce memory footprint; we all know how nice ankerl::unordered_dense is in theory 4x faster - in practice these maps arent that "hot" anyways so not likely to have much perf gained i just want to reduce mem fragmentation to ease my porting process, plus it helps other platforms as well (ahem weak Mediatek devices) :) Signed-off-by: lizzie <lizzie@eden-emu.dev> Co-authored-by: Caio Oliveira <caiooliveirafarias0@gmail.com> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3442 Reviewed-by: DraVee <dravee@eden-emu.dev> Reviewed-by: CamilleLaVey <camillelavey99@gmail.com> Co-authored-by: lizzie <lizzie@eden-emu.dev> Co-committed-by: lizzie <lizzie@eden-emu.dev>
Diffstat (limited to 'src/video_core')
-rw-r--r--src/video_core/buffer_cache/buffer_cache_base.h4
-rw-r--r--src/video_core/buffer_cache/memory_tracker_base.h4
-rw-r--r--src/video_core/control/channel_state_cache.h8
-rw-r--r--src/video_core/control/scheduler.h7
-rw-r--r--src/video_core/engines/maxwell_3d.h4
-rw-r--r--src/video_core/engines/sw_blitter/converter.cpp6
-rw-r--r--src/video_core/gpu.cpp4
-rw-r--r--src/video_core/gpu_logging/gpu_logging.h4
-rw-r--r--[-rwxr-xr-x]src/video_core/host1x/codecs/decoder.h5
-rw-r--r--src/video_core/host1x/host1x.h12
-rw-r--r--src/video_core/macro.h8
-rw-r--r--src/video_core/query_cache.h8
-rw-r--r--src/video_core/query_cache/query_cache.h4
-rw-r--r--src/video_core/query_cache/query_cache_base.h9
-rw-r--r--src/video_core/renderer_opengl/gl_buffer_cache.h6
-rw-r--r--src/video_core/renderer_opengl/gl_shader_cache.h9
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.h4
-rw-r--r--src/video_core/renderer_vulkan/vk_pipeline_cache.h9
-rw-r--r--src/video_core/renderer_vulkan/vk_query_cache.cpp8
-rw-r--r--src/video_core/renderer_vulkan/vk_render_pass_cache.cpp2
-rw-r--r--src/video_core/renderer_vulkan/vk_render_pass_cache.h7
-rw-r--r--src/video_core/shader_cache.h8
-rw-r--r--src/video_core/shader_environment.h18
-rw-r--r--src/video_core/texture_cache/texture_cache.h10
-rw-r--r--src/video_core/texture_cache/texture_cache_base.h23
-rw-r--r--src/video_core/vulkan_common/vulkan_device.cpp10
-rw-r--r--src/video_core/vulkan_common/vulkan_device.h4
27 files changed, 112 insertions, 93 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache_base.h b/src/video_core/buffer_cache/buffer_cache_base.h
index ed50634683..3c0bc81758 100644
--- a/src/video_core/buffer_cache/buffer_cache_base.h
+++ b/src/video_core/buffer_cache/buffer_cache_base.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
@@ -14,7 +14,7 @@
#include <mutex>
#include <numeric>
#include <span>
-#include <unordered_map>
+#include <ankerl/unordered_dense.h>
#include <vector>
#include "common/common_types.h"
diff --git a/src/video_core/buffer_cache/memory_tracker_base.h b/src/video_core/buffer_cache/memory_tracker_base.h
index 4181b0ae54..2c571271d6 100644
--- a/src/video_core/buffer_cache/memory_tracker_base.h
+++ b/src/video_core/buffer_cache/memory_tracker_base.h
@@ -11,7 +11,7 @@
#include <deque>
#include <limits>
#include <type_traits>
-#include <unordered_set>
+#include <ankerl/unordered_dense.h>
#include <utility>
#include "common/alignment.h"
@@ -257,7 +257,7 @@ private:
std::array<Manager*, NUM_HIGH_PAGES> top_tier{};
std::deque<std::array<Manager, MANAGER_POOL_SIZE>> manager_pool;
std::deque<Manager*> free_managers;
- std::unordered_set<u32> cached_pages;
+ ankerl::unordered_dense::set<u32> cached_pages;
DeviceTracker* device_tracker = nullptr;
};
diff --git a/src/video_core/control/channel_state_cache.h b/src/video_core/control/channel_state_cache.h
index 58f6a34c16..f8b8abcac6 100644
--- a/src/video_core/control/channel_state_cache.h
+++ b/src/video_core/control/channel_state_cache.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2022 yuzu Emulator Project
@@ -10,7 +10,7 @@
#include <limits>
#include <mutex>
#include <optional>
-#include <unordered_map>
+#include <ankerl/unordered_dense.h>
#include <vector>
#include "common/common_types.h"
@@ -88,14 +88,14 @@ protected:
std::deque<P> channel_storage;
std::deque<size_t> free_channel_ids;
- std::unordered_map<s32, size_t> channel_map;
+ ankerl::unordered_dense::map<s32, size_t> channel_map;
std::vector<size_t> active_channel_ids;
struct AddressSpaceRef {
size_t ref_count;
size_t storage_id;
Tegra::MemoryManager* gpu_memory;
};
- std::unordered_map<size_t, AddressSpaceRef> address_spaces;
+ ankerl::unordered_dense::map<size_t, AddressSpaceRef> address_spaces;
mutable std::mutex config_mutex;
virtual void OnGPUASRegister([[maybe_unused]] size_t map_id) {}
diff --git a/src/video_core/control/scheduler.h b/src/video_core/control/scheduler.h
index 44addf61c4..9c2b9de32b 100644
--- a/src/video_core/control/scheduler.h
+++ b/src/video_core/control/scheduler.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -5,7 +8,7 @@
#include <memory>
#include <mutex>
-#include <unordered_map>
+#include <ankerl/unordered_dense.h>
#include "video_core/dma_pusher.h"
@@ -27,7 +30,7 @@ public:
void DeclareChannel(std::shared_ptr<ChannelState> new_channel);
private:
- std::unordered_map<s32, std::shared_ptr<ChannelState>> channels;
+ ankerl::unordered_dense::map<s32, std::shared_ptr<ChannelState>> channels;
std::mutex scheduling_guard;
GPU& gpu;
};
diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h
index 8c50a4ea2f..5312c04b6f 100644
--- a/src/video_core/engines/maxwell_3d.h
+++ b/src/video_core/engines/maxwell_3d.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
@@ -3056,7 +3056,7 @@ public:
void SetHLEReplacementAttributeType(u32 bank, u32 offset, HLEReplacementAttributeType name);
- std::unordered_map<u64, HLEReplacementAttributeType> replace_table;
+ ankerl::unordered_dense::map<u64, HLEReplacementAttributeType> replace_table;
static_assert(sizeof(Regs) == Regs::NUM_REGS * sizeof(u32), "Maxwell3D Regs has wrong size");
static_assert(std::is_trivially_copyable_v<Regs>, "Maxwell3D Regs must be trivially copyable");
diff --git a/src/video_core/engines/sw_blitter/converter.cpp b/src/video_core/engines/sw_blitter/converter.cpp
index b4722f7976..6682c96444 100644
--- a/src/video_core/engines/sw_blitter/converter.cpp
+++ b/src/video_core/engines/sw_blitter/converter.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
@@ -7,7 +7,7 @@
#include <array>
#include <cmath>
#include <span>
-#include <unordered_map>
+#include <ankerl/unordered_dense.h>
#include <bit>
#include <numeric>
#include "common/assert.h"
@@ -924,7 +924,7 @@ public:
};
struct ConverterFactory::ConverterFactoryImpl {
- std::unordered_map<RenderTargetFormat, std::unique_ptr<Converter>> converters_cache;
+ ankerl::unordered_dense::map<RenderTargetFormat, std::unique_ptr<Converter>> converters_cache;
};
ConverterFactory::ConverterFactory() {
diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp
index 36d726c929..d65658323e 100644
--- a/src/video_core/gpu.cpp
+++ b/src/video_core/gpu.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
@@ -373,7 +373,7 @@ struct GPU::Impl {
std::unique_ptr<Core::Frontend::GraphicsContext> cpu_context;
std::unique_ptr<Tegra::Control::Scheduler> scheduler;
- std::unordered_map<s32, std::shared_ptr<Tegra::Control::ChannelState>> channels;
+ ankerl::unordered_dense::map<s32, std::shared_ptr<Tegra::Control::ChannelState>> channels;
Tegra::Control::ChannelState* current_channel;
s32 bound_channel{-1};
diff --git a/src/video_core/gpu_logging/gpu_logging.h b/src/video_core/gpu_logging/gpu_logging.h
index c248e9b036..134fa94c0f 100644
--- a/src/video_core/gpu_logging/gpu_logging.h
+++ b/src/video_core/gpu_logging/gpu_logging.h
@@ -10,7 +10,7 @@
#include <set>
#include <span>
#include <string>
-#include <unordered_map>
+#include <ankerl/unordered_dense.h>
#include <vector>
#include "common/common_types.h"
@@ -154,7 +154,7 @@ private:
mutable std::mutex ring_buffer_mutex;
// Memory tracking
- std::unordered_map<uintptr_t, MemoryAllocationEntry> memory_allocations;
+ ankerl::unordered_dense::map<uintptr_t, MemoryAllocationEntry> memory_allocations;
mutable std::mutex memory_mutex;
// Statistics
diff --git a/src/video_core/host1x/codecs/decoder.h b/src/video_core/host1x/codecs/decoder.h
index 22e6db8151..d25da81fd4 100755..100644
--- a/src/video_core/host1x/codecs/decoder.h
+++ b/src/video_core/host1x/codecs/decoder.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -7,7 +10,7 @@
#include <mutex>
#include <optional>
#include <string_view>
-#include <unordered_map>
+#include <ankerl/unordered_dense.h>
#include <queue>
#include "common/common_types.h"
diff --git a/src/video_core/host1x/host1x.h b/src/video_core/host1x/host1x.h
index 98dd593185..d7534da23a 100644
--- a/src/video_core/host1x/host1x.h
+++ b/src/video_core/host1x/host1x.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2021 yuzu Emulator Project
@@ -6,8 +6,8 @@
#pragma once
+#include <ankerl/unordered_dense.h>
#include <unordered_map>
-#include <unordered_set>
#include <queue>
#include "common/common_types.h"
@@ -134,15 +134,15 @@ private:
if (it == map->second.end()) {
return {};
}
-
+ // TODO: this "mapped" prevents us from fully embracing ankerl
return std::move(map->second.extract(it).mapped());
}
using FramePtr = std::shared_ptr<FFmpeg::Frame>;
std::mutex m_mutex{};
- std::unordered_map<s32, std::deque<std::pair<u64, FramePtr>>> m_presentation_order;
- std::unordered_map<s32, std::unordered_map<u64, FramePtr>> m_decode_order;
+ ankerl::unordered_dense::map<s32, std::deque<std::pair<u64, FramePtr>>> m_presentation_order;
+ ankerl::unordered_dense::map<s32, std::unordered_map<u64, FramePtr>> m_decode_order;
static constexpr size_t MAX_PRESENT_QUEUE = 100;
static constexpr size_t MAX_DECODE_MAP = 200;
@@ -218,7 +218,7 @@ private:
Tegra::MemoryManager gmmu_manager;
std::unique_ptr<Common::FlatAllocator<u32, 0, 32>> allocator;
FrameQueue frame_queue;
- std::unordered_map<s32, std::unique_ptr<CDmaPusher>> devices;
+ ankerl::unordered_dense::map<s32, std::unique_ptr<CDmaPusher>> devices;
#ifdef YUZU_LEGACY
std::once_flag nvdec_first_init;
std::once_flag vic_first_init;
diff --git a/src/video_core/macro.h b/src/video_core/macro.h
index 685097a693..9bdb4219ce 100644
--- a/src/video_core/macro.h
+++ b/src/video_core/macro.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
@@ -7,7 +7,7 @@
#pragma once
#include <memory>
-#include <unordered_map>
+#include <ankerl/unordered_dense.h>
#include <vector>
#include "common/bit_field.h"
#include "common/common_types.h"
@@ -147,8 +147,8 @@ private:
bool has_hle_program{};
};
- std::unordered_map<u32, CacheInfo> macro_cache;
- std::unordered_map<u32, std::vector<u32>> uploaded_macro_code;
+ ankerl::unordered_dense::map<u32, CacheInfo> macro_cache;
+ ankerl::unordered_dense::map<u32, std::vector<u32>> uploaded_macro_code;
std::optional<HLEMacro> hle_macros;
Engines::Maxwell3D& maxwell3d;
bool is_interpreted;
diff --git a/src/video_core/query_cache.h b/src/video_core/query_cache.h
index e1019f2285..ebb87fe65a 100644
--- a/src/video_core/query_cache.h
+++ b/src/video_core/query_cache.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -12,8 +15,7 @@
#include <memory>
#include <mutex>
#include <optional>
-#include <unordered_map>
-#include <unordered_set>
+#include <ankerl/unordered_dense.h>
#include <vector>
#include "common/assert.h"
@@ -348,7 +350,7 @@ private:
mutable std::recursive_mutex mutex;
- std::unordered_map<u64, std::vector<CachedQuery>> cached_queries;
+ ankerl::unordered_dense::map<u64, std::vector<CachedQuery>> cached_queries;
std::array<CounterStream, VideoCore::NumQueryTypes> streams;
diff --git a/src/video_core/query_cache/query_cache.h b/src/video_core/query_cache/query_cache.h
index 6e084cc079..3aeeb8dcab 100644
--- a/src/video_core/query_cache/query_cache.h
+++ b/src/video_core/query_cache/query_cache.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
@@ -10,7 +10,7 @@
#include <deque>
#include <memory>
#include <mutex>
-#include <unordered_map>
+#include <ankerl/unordered_dense.h>
#include <utility>
#include "common/assert.h"
diff --git a/src/video_core/query_cache/query_cache_base.h b/src/video_core/query_cache/query_cache_base.h
index 00c25c8d63..242e24388f 100644
--- a/src/video_core/query_cache/query_cache_base.h
+++ b/src/video_core/query_cache/query_cache_base.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -7,7 +10,7 @@
#include <mutex>
#include <optional>
#include <span>
-#include <unordered_map>
+#include <ankerl/unordered_dense.h>
#include <utility>
#include "common/assert.h"
@@ -157,7 +160,7 @@ protected:
}
}
- using ContentCache = std::unordered_map<u64, std::unordered_map<u32, QueryLocation>>;
+ using ContentCache = ankerl::unordered_dense::map<u64, ankerl::unordered_dense::map<u32, QueryLocation>>;
void InvalidateQuery(QueryLocation location);
bool IsQueryDirty(QueryLocation location);
@@ -165,7 +168,7 @@ protected:
void RequestGuestHostSync();
void UnregisterPending();
- std::unordered_map<u64, std::unordered_map<u32, QueryLocation>> cached_queries;
+ ankerl::unordered_dense::map<u64, ankerl::unordered_dense::map<u32, QueryLocation>> cached_queries;
std::mutex cache_mutex;
struct QueryCacheBaseImpl;
diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.h b/src/video_core/renderer_opengl/gl_buffer_cache.h
index 23ebe50196..a0acfc48c1 100644
--- a/src/video_core/renderer_opengl/gl_buffer_cache.h
+++ b/src/video_core/renderer_opengl/gl_buffer_cache.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
@@ -8,7 +8,7 @@
#include <array>
#include <span>
-#include <unordered_map>
+#include <ankerl/unordered_dense.h>
#include "common/common_types.h"
#include "video_core/buffer_cache/buffer_cache_base.h"
@@ -242,7 +242,7 @@ private:
u32 index_buffer_offset = 0;
u64 device_access_memory;
- std::unordered_map<GPUVAddr, OGLTransformFeedback> tfb_objects;
+ ankerl::unordered_dense::map<GPUVAddr, OGLTransformFeedback> tfb_objects;
};
struct BufferCacheParams {
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.h b/src/video_core/renderer_opengl/gl_shader_cache.h
index 2b46c22c70..3398ba6f51 100644
--- a/src/video_core/renderer_opengl/gl_shader_cache.h
+++ b/src/video_core/renderer_opengl/gl_shader_cache.h
@@ -1,10 +1,13 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <filesystem>
-#include <unordered_map>
+#include <ankerl/unordered_dense.h>
#include "common/common_types.h"
#include "common/thread_worker.h"
@@ -79,8 +82,8 @@ private:
GraphicsPipeline* current_pipeline{};
ShaderContext::ShaderPools main_pools;
- std::unordered_map<GraphicsPipelineKey, std::unique_ptr<GraphicsPipeline>> graphics_cache;
- std::unordered_map<ComputePipelineKey, std::unique_ptr<ComputePipeline>> compute_cache;
+ ankerl::unordered_dense::map<GraphicsPipelineKey, std::unique_ptr<GraphicsPipeline>> graphics_cache;
+ ankerl::unordered_dense::map<ComputePipelineKey, std::unique_ptr<ComputePipeline>> compute_cache;
Shader::Profile profile;
Shader::HostTranslateInfo host_info;
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.h b/src/video_core/renderer_opengl/gl_texture_cache.h
index e2a2022cb2..dfcef4b0b6 100644
--- a/src/video_core/renderer_opengl/gl_texture_cache.h
+++ b/src/video_core/renderer_opengl/gl_texture_cache.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
@@ -157,7 +157,7 @@ private:
UtilShaders util_shaders;
FormatConversionPass format_conversion_pass;
- std::array<std::unordered_map<GLenum, FormatProperties>, 3> format_properties;
+ std::array<ankerl::unordered_dense::map<GLenum, FormatProperties>, 3> format_properties;
bool has_broken_texture_view_formats = false;
OGLTexture null_image_1d_array;
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.h b/src/video_core/renderer_vulkan/vk_pipeline_cache.h
index 7909bd8cf0..1f7dab935c 100644
--- a/src/video_core/renderer_vulkan/vk_pipeline_cache.h
+++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -8,7 +11,7 @@
#include <filesystem>
#include <memory>
#include <type_traits>
-#include <unordered_map>
+#include <ankerl/unordered_dense.h>
#include <vector>
#include "common/common_types.h"
@@ -155,8 +158,8 @@ private:
GraphicsPipelineCacheKey graphics_key{};
GraphicsPipeline* current_pipeline{};
- std::unordered_map<ComputePipelineCacheKey, std::unique_ptr<ComputePipeline>> compute_cache;
- std::unordered_map<GraphicsPipelineCacheKey, std::unique_ptr<GraphicsPipeline>> graphics_cache;
+ ankerl::unordered_dense::map<ComputePipelineCacheKey, std::unique_ptr<ComputePipeline>> compute_cache;
+ ankerl::unordered_dense::map<GraphicsPipelineCacheKey, std::unique_ptr<GraphicsPipeline>> graphics_cache;
ShaderPools main_pools;
diff --git a/src/video_core/renderer_vulkan/vk_query_cache.cpp b/src/video_core/renderer_vulkan/vk_query_cache.cpp
index b9ff4cd00e..c035eb7cd9 100644
--- a/src/video_core/renderer_vulkan/vk_query_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_query_cache.cpp
@@ -10,7 +10,7 @@
#include <memory>
#include <span>
#include <type_traits>
-#include <unordered_map>
+#include <ankerl/unordered_dense.h>
#include <utility>
#include <vector>
#include "video_core/renderer_vulkan/vk_texture_cache.h"
@@ -230,7 +230,7 @@ public:
sync_values_stash.emplace_back();
std::vector<HostSyncValues>* sync_values = &sync_values_stash.back();
sync_values->reserve(num_slots_used);
- std::unordered_map<size_t, std::pair<size_t, size_t>> offsets;
+ ankerl::unordered_dense::map<size_t, std::pair<size_t, size_t>> offsets;
resolve_buffers.clear();
size_t resolve_buffer_index = ObtainBuffer<true>(num_slots_used);
resolve_buffers.push_back(resolve_buffer_index);
@@ -412,7 +412,7 @@ private:
template <bool is_ordered, typename Func>
void ApplyBanksWideOp(std::vector<size_t>& queries, Func&& func) {
std::conditional_t<is_ordered, std::map<size_t, std::pair<size_t, size_t>>,
- std::unordered_map<size_t, std::pair<size_t, size_t>>>
+ ankerl::unordered_dense::map<size_t, std::pair<size_t, size_t>>>
indexer;
for (auto q : queries) {
auto* query = GetQuery(q);
@@ -722,7 +722,7 @@ public:
void SyncWrites() override {
CloseCounter();
- std::unordered_map<size_t, std::vector<HostSyncValues>> sync_values_stash;
+ ankerl::unordered_dense::map<size_t, std::vector<HostSyncValues>> sync_values_stash;
for (auto q : pending_sync) {
auto* query = GetQuery(q);
if (True(query->flags & VideoCommon::QueryFlagBits::IsRewritten)) {
diff --git a/src/video_core/renderer_vulkan/vk_render_pass_cache.cpp b/src/video_core/renderer_vulkan/vk_render_pass_cache.cpp
index f1e15595b3..1d7af349d1 100644
--- a/src/video_core/renderer_vulkan/vk_render_pass_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_render_pass_cache.cpp
@@ -4,7 +4,7 @@
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
-#include <unordered_map>
+#include <ankerl/unordered_dense.h>
#include <boost/container/static_vector.hpp>
diff --git a/src/video_core/renderer_vulkan/vk_render_pass_cache.h b/src/video_core/renderer_vulkan/vk_render_pass_cache.h
index 91ad4bf577..5c7b3c2aed 100644
--- a/src/video_core/renderer_vulkan/vk_render_pass_cache.h
+++ b/src/video_core/renderer_vulkan/vk_render_pass_cache.h
@@ -1,10 +1,13 @@
+// SPDX-FileCopyrightText: Copyright 2026 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
#pragma once
#include <mutex>
-#include <unordered_map>
+#include <ankerl/unordered_dense.h>
#include "video_core/surface.h"
#include "video_core/vulkan_common/vulkan_wrapper.h"
@@ -47,7 +50,7 @@ public:
private:
const Device* device{};
- std::unordered_map<RenderPassKey, vk::RenderPass> cache;
+ ankerl::unordered_dense::map<RenderPassKey, vk::RenderPass> cache;
std::mutex mutex;
};
diff --git a/src/video_core/shader_cache.h b/src/video_core/shader_cache.h
index 244146fe52..7d93a542ef 100644
--- a/src/video_core/shader_cache.h
+++ b/src/video_core/shader_cache.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
@@ -10,7 +10,7 @@
#include <memory>
#include <mutex>
#include <span>
-#include <unordered_map>
+#include <ankerl/unordered_dense.h>
#include <utility>
#include <vector>
@@ -148,8 +148,8 @@ private:
mutable std::mutex lookup_mutex;
std::mutex invalidation_mutex;
- std::unordered_map<u64, std::unique_ptr<Entry>> lookup_cache;
- std::unordered_map<u64, std::vector<Entry*>> invalidation_cache;
+ ankerl::unordered_dense::map<u64, std::unique_ptr<Entry>> lookup_cache;
+ ankerl::unordered_dense::map<u64, std::vector<Entry*>> invalidation_cache;
std::vector<std::unique_ptr<ShaderInfo>> storage;
std::vector<Entry*> marked_for_removal;
};
diff --git a/src/video_core/shader_environment.h b/src/video_core/shader_environment.h
index c5bd0e7339..183b6b903b 100644
--- a/src/video_core/shader_environment.h
+++ b/src/video_core/shader_environment.h
@@ -14,7 +14,7 @@
#include <optional>
#include <span>
#include <type_traits>
-#include <unordered_map>
+#include <ankerl/unordered_dense.h>
#include <vector>
#include "common/common_types.h"
@@ -79,10 +79,10 @@ protected:
GPUVAddr program_base{};
std::vector<u64> code;
- std::unordered_map<u32, Shader::TextureType> texture_types;
- std::unordered_map<u32, Shader::TexturePixelFormat> texture_pixel_formats;
- std::unordered_map<u64, u32> cbuf_values;
- std::unordered_map<u64, Shader::ReplaceConstant> cbuf_replacements;
+ ankerl::unordered_dense::map<u32, Shader::TextureType> texture_types;
+ ankerl::unordered_dense::map<u32, Shader::TexturePixelFormat> texture_pixel_formats;
+ ankerl::unordered_dense::map<u64, u32> cbuf_values;
+ ankerl::unordered_dense::map<u64, Shader::ReplaceConstant> cbuf_replacements;
u32 local_memory_size{};
u32 texture_bound{};
@@ -201,10 +201,10 @@ public:
private:
std::vector<u64> code;
- std::unordered_map<u32, Shader::TextureType> texture_types;
- std::unordered_map<u32, Shader::TexturePixelFormat> texture_pixel_formats;
- std::unordered_map<u64, u32> cbuf_values;
- std::unordered_map<u64, Shader::ReplaceConstant> cbuf_replacements;
+ ankerl::unordered_dense::map<u32, Shader::TextureType> texture_types;
+ ankerl::unordered_dense::map<u32, Shader::TexturePixelFormat> texture_pixel_formats;
+ ankerl::unordered_dense::map<u64, u32> cbuf_values;
+ ankerl::unordered_dense::map<u64, Shader::ReplaceConstant> cbuf_replacements;
std::array<u32, 3> workgroup_size{};
u32 local_memory_size{};
u32 shared_memory_size{};
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index 2564a67780..0ed65e29e9 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -9,7 +9,7 @@
#include <limits>
#include <optional>
#include <bit>
-#include <unordered_set>
+#include <ankerl/unordered_dense.h>
#include <boost/container/small_vector.hpp>
#include "common/alignment.h"
@@ -1989,8 +1989,8 @@ SamplerId TextureCache<P>::FindSampler(const TSCEntry& config) {
}
const auto [pair, is_new] = channel_state->samplers.try_emplace(config);
if (is_new) {
- EnforceSamplerBudget();
pair->second = slot_samplers.insert(runtime, config);
+ EnforceSamplerBudget();
}
return pair->second;
}
@@ -2035,7 +2035,7 @@ void TextureCache<P>::TrimInactiveSamplers(size_t budget) {
}
set.insert(id);
};
- std::unordered_set<SamplerId> active;
+ ankerl::unordered_dense::set<SamplerId> active;
active.reserve(channel_state->graphics_sampler_ids.size() +
channel_state->compute_sampler_ids.size());
for (const SamplerId id : channel_state->graphics_sampler_ids) {
@@ -2363,9 +2363,7 @@ void TextureCache<P>::UnregisterImage(ImageId image_id) {
image.flags &= ~ImageFlagBits::BadOverlap;
lru_cache.Free(image.lru_index);
const auto& clear_page_table =
- [image_id](u64 page,
- std::unordered_map<u64, std::vector<ImageId>, Common::IdentityHash<u64>>&
- selected_page_table) {
+ [image_id](u64 page, ankerl::unordered_dense::map<u64, std::vector<ImageId>, Common::IdentityHash<u64>>& selected_page_table) {
const auto page_it = selected_page_table.find(page);
if (page_it == selected_page_table.end()) {
ASSERT_MSG(false, "Unregistering unregistered page=0x{:x}", page << YUZU_PAGEBITS);
diff --git a/src/video_core/texture_cache/texture_cache_base.h b/src/video_core/texture_cache/texture_cache_base.h
index 42f1a158d9..cff300da8f 100644
--- a/src/video_core/texture_cache/texture_cache_base.h
+++ b/src/video_core/texture_cache/texture_cache_base.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
@@ -12,8 +12,9 @@
#include <mutex>
#include <span>
#include <type_traits>
+// TODO: find out which don't require stable iters
#include <unordered_map>
-#include <unordered_set>
+#include <ankerl/unordered_dense.h>
#include <vector>
#include <boost/container/small_vector.hpp>
#include <queue>
@@ -66,7 +67,7 @@ struct AsyncDecodeContext {
std::atomic_bool complete;
};
-using TextureCacheGPUMap = std::unordered_map<u64, std::vector<ImageId>, Common::IdentityHash<u64>>;
+using TextureCacheGPUMap = ankerl::unordered_dense::map<u64, std::vector<ImageId>, Common::IdentityHash<u64>>;
class TextureCacheChannelInfo : public ChannelInfo {
public:
@@ -85,6 +86,7 @@ public:
std::vector<SamplerId> compute_sampler_ids;
std::vector<ImageViewId> compute_image_view_ids;
+ // TODO: still relies on bad iterators :(
std::unordered_map<TICEntry, ImageViewId> image_views;
std::unordered_map<TSCEntry, SamplerId> samplers;
@@ -454,10 +456,9 @@ private:
RenderTargets render_targets;
- std::unordered_map<RenderTargets, FramebufferId> framebuffers;
-
- std::unordered_map<u64, std::vector<ImageMapId>, Common::IdentityHash<u64>> page_table;
- std::unordered_map<ImageId, boost::container::small_vector<ImageViewId, 16>> sparse_views;
+ ankerl::unordered_dense::map<RenderTargets, FramebufferId> framebuffers;
+ ankerl::unordered_dense::map<u64, std::vector<ImageMapId>, Common::IdentityHash<u64>> page_table;
+ ankerl::unordered_dense::map<ImageId, boost::container::small_vector<ImageViewId, 16>> sparse_views;
DAddr virtual_invalid_space{};
@@ -514,7 +515,7 @@ private:
DelayedDestructionRing<ImageView, TICKS_TO_DESTROY> sentenced_image_view;
DelayedDestructionRing<Framebuffer, TICKS_TO_DESTROY> sentenced_framebuffers;
- std::unordered_map<GPUVAddr, ImageAllocId> image_allocs_table;
+ ankerl::unordered_dense::map<GPUVAddr, ImageAllocId> image_allocs_table;
Common::ScratchBuffer<u8> swizzle_data_buffer;
Common::ScratchBuffer<u8> unswizzle_data_buffer;
@@ -531,17 +532,17 @@ private:
// Join caching
boost::container::small_vector<ImageId, 4> join_overlap_ids;
- std::unordered_set<ImageId> join_overlaps_found;
+ ankerl::unordered_dense::set<ImageId> join_overlaps_found;
boost::container::small_vector<ImageId, 4> join_left_aliased_ids;
boost::container::small_vector<ImageId, 4> join_right_aliased_ids;
- std::unordered_set<ImageId> join_ignore_textures;
+ ankerl::unordered_dense::set<ImageId> join_ignore_textures;
boost::container::small_vector<ImageId, 4> join_bad_overlap_ids;
struct JoinCopy {
bool is_alias;
ImageId id;
};
boost::container::small_vector<JoinCopy, 4> join_copies_to_do;
- std::unordered_map<ImageId, size_t> join_alias_indices;
+ ankerl::unordered_dense::map<ImageId, size_t> join_alias_indices;
};
} // namespace VideoCommon
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp
index f06551b91e..8cb2ebfb62 100644
--- a/src/video_core/vulkan_common/vulkan_device.cpp
+++ b/src/video_core/vulkan_common/vulkan_device.cpp
@@ -9,7 +9,7 @@
#include <chrono>
#include <optional>
#include <thread>
-#include <unordered_set>
+#include <ankerl/unordered_dense.h>
#include <utility>
#include <vector>
@@ -145,7 +145,7 @@ VkFormatFeatureFlags GetFormatFeatures(VkFormatProperties properties, FormatType
}
}
-std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(vk::PhysicalDevice physical) {
+ankerl::unordered_dense::map<VkFormat, VkFormatProperties> GetFormatProperties(vk::PhysicalDevice physical) {
static constexpr std::array formats{
VK_FORMAT_A1R5G5B5_UNORM_PACK16,
VK_FORMAT_A2B10G10R10_SINT_PACK32,
@@ -287,7 +287,7 @@ std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(vk::Physica
VK_FORMAT_R8_USCALED,
VK_FORMAT_S8_UINT,
};
- std::unordered_map<VkFormat, VkFormatProperties> format_properties;
+ ankerl::unordered_dense::map<VkFormat, VkFormatProperties> format_properties;
for (const auto format : formats) {
format_properties.emplace(format, physical.GetFormatProperties(format));
}
@@ -295,7 +295,7 @@ std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(vk::Physica
}
#if defined(ANDROID) && defined(ARCHITECTURE_arm64)
-void OverrideBcnFormats(std::unordered_map<VkFormat, VkFormatProperties>& format_properties) {
+void OverrideBcnFormats(ankerl::unordered_dense::map<VkFormat, VkFormatProperties>& format_properties) {
// These properties are extracted from Adreno driver 512.687.0
constexpr VkFormatFeatureFlags tiling_features{VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT |
VK_FORMAT_FEATURE_BLIT_SRC_BIT |
@@ -1612,7 +1612,7 @@ void Device::CollectToolingInfo() {
std::vector<VkDeviceQueueCreateInfo> Device::GetDeviceQueueCreateInfos() const {
static constexpr float QUEUE_PRIORITY = 1.0f;
- std::unordered_set<u32> unique_queue_families{graphics_family, present_family};
+ ankerl::unordered_dense::set<u32> unique_queue_families{graphics_family, present_family};
std::vector<VkDeviceQueueCreateInfo> queue_cis;
queue_cis.reserve(unique_queue_families.size());
diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h
index 73a232ddee..7d738a81df 100644
--- a/src/video_core/vulkan_common/vulkan_device.h
+++ b/src/video_core/vulkan_common/vulkan_device.h
@@ -10,7 +10,7 @@
#include <set>
#include <span>
#include <string>
-#include <unordered_map>
+#include <ankerl/unordered_dense.h>
#include <vector>
#include "common/common_types.h"
@@ -1074,7 +1074,7 @@ private:
std::vector<size_t> valid_heap_memory; ///< Heaps used.
/// Format properties dictionary.
- std::unordered_map<VkFormat, VkFormatProperties> format_properties;
+ ankerl::unordered_dense::map<VkFormat, VkFormatProperties> format_properties;
/// Nsight Aftermath GPU crash tracker
std::unique_ptr<NsightAftermathTracker> nsight_aftermath_tracker;