From c6e3c0e45c1b65f8c2391362abb2de53d6e86ee3 Mon Sep 17 00:00:00 2001 From: ReinUsesLisp Date: Thu, 28 May 2020 02:00:21 -0300 Subject: [PATCH] video_core: Replace most unordered hash tables with tsl-robin Trivially replace most std::unordered_map usages with tsl::robin_map and std::unordered_set with tsl::robin_set. None std::unordered_* usage in video_core stores pointers or iterators beyond their immediate scope. This allows us to swap to tsl::robin_* tables without issues. --- src/video_core/CMakeLists.txt | 1 + src/video_core/buffer_cache/buffer_block.h | 1 - src/video_core/buffer_cache/buffer_cache.h | 28 ++++++++++--------- src/video_core/engines/maxwell_3d.h | 1 - src/video_core/query_cache.h | 21 +++++++------- .../renderer_opengl/gl_framebuffer_cache.cpp | 7 +++-- .../renderer_opengl/gl_framebuffer_cache.h | 8 ++++-- .../renderer_opengl/gl_query_cache.cpp | 3 +- .../renderer_opengl/gl_shader_cache.cpp | 18 ++++++------ .../renderer_opengl/gl_shader_cache.h | 12 ++++---- .../renderer_opengl/gl_shader_decompiler.cpp | 4 +-- .../renderer_opengl/gl_shader_disk_cache.h | 7 +++-- .../renderer_opengl/gl_texture_cache.h | 5 ++-- src/video_core/renderer_vulkan/vk_device.cpp | 19 +++++++------ src/video_core/renderer_vulkan/vk_device.h | 5 ++-- .../renderer_vulkan/vk_pipeline_cache.cpp | 8 +++--- .../renderer_vulkan/vk_pipeline_cache.h | 16 +++++++++-- .../renderer_vulkan/vk_rasterizer.cpp | 4 +-- .../renderer_vulkan/vk_rasterizer.h | 5 +++- .../renderer_vulkan/vk_renderpass_cache.cpp | 8 +++--- .../renderer_vulkan/vk_renderpass_cache.h | 8 ++++-- .../renderer_vulkan/vk_sampler_cache.cpp | 2 +- .../renderer_vulkan/vk_shader_decompiler.cpp | 7 +++-- .../vk_staging_buffer_pool.cpp | 3 +- .../renderer_vulkan/vk_texture_cache.cpp | 4 +-- .../renderer_vulkan/vk_texture_cache.h | 5 ++-- src/video_core/sampler_cache.h | 12 +++++--- src/video_core/shader/control_flow.cpp | 7 +++-- src/video_core/shader/registry.h | 12 ++++---- src/video_core/shader/transform_feedback.cpp | 8 +++--- src/video_core/shader/transform_feedback.h | 4 +-- src/video_core/shader_cache.h | 10 +++---- src/video_core/texture_cache/surface_base.h | 9 +++--- src/video_core/texture_cache/texture_cache.h | 22 +++++++++------ 34 files changed, 167 insertions(+), 127 deletions(-) diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 21c46a5670..3c17c0dfca 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -239,6 +239,7 @@ create_target_directory_groups(video_core) target_link_libraries(video_core PUBLIC common core) target_link_libraries(video_core PRIVATE glad xbyak) +target_include_directories(video_core PRIVATE tsl-robin-map::tsl-robin-map) if (ENABLE_VULKAN) target_include_directories(video_core PRIVATE sirit ../../externals/Vulkan-Headers/include) diff --git a/src/video_core/buffer_cache/buffer_block.h b/src/video_core/buffer_cache/buffer_block.h index e64170e668..944b4c88df 100644 --- a/src/video_core/buffer_cache/buffer_block.h +++ b/src/video_core/buffer_cache/buffer_block.h @@ -4,7 +4,6 @@ #pragma once -#include #include #include "common/alignment.h" diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index dd7ce8c996..7443f8d627 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -7,8 +7,6 @@ #include #include #include -#include -#include #include #include @@ -16,6 +14,9 @@ #include #include +#include +#include + #include "common/alignment.h" #include "common/assert.h" #include "common/common_types.h" @@ -526,7 +527,7 @@ private: for (u64 page_start = start >> WRITE_PAGE_BIT; page_start <= page_end; ++page_start) { auto it = written_pages.find(page_start); if (it != written_pages.end()) { - it->second = it->second + 1; + it.value() += 1; } else { written_pages.insert_or_assign(page_start, 1); } @@ -537,12 +538,13 @@ private: const u64 page_end = end >> WRITE_PAGE_BIT; for (u64 page_start = start >> WRITE_PAGE_BIT; page_start <= page_end; ++page_start) { auto it = written_pages.find(page_start); - if (it != written_pages.end()) { - if (it->second > 1) { - it->second = it->second - 1; - } else { - written_pages.erase(it); - } + if (it == written_pages.end()) { + continue; + } + u32& num_stores = it.value(); + --num_stores; + if (num_stores == 0) { + written_pages.erase(it); } } } @@ -564,7 +566,7 @@ private: void MarkForAsyncFlush(MapInterval* map) { if (!uncommitted_flushes) { - uncommitted_flushes = std::make_shared>(); + uncommitted_flushes = std::make_shared>(); } uncommitted_flushes->insert(map); } @@ -583,8 +585,8 @@ private: boost::intrusive::set> mapped_addresses; - std::unordered_map written_pages; - std::unordered_map> blocks; + tsl::robin_map written_pages; + tsl::robin_map> blocks; std::queue> pending_destruction; u64 epoch = 0; @@ -594,7 +596,7 @@ private: std::list marked_for_unregister; - std::shared_ptr> uncommitted_flushes; + std::shared_ptr> uncommitted_flushes; std::list>> committed_flushes; std::recursive_mutex mutex; diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index ef1618990b..9e02ca401b 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h @@ -9,7 +9,6 @@ #include #include #include -#include #include #include "common/assert.h" diff --git a/src/video_core/query_cache.h b/src/video_core/query_cache.h index 0d3a88765e..408e5ee046 100644 --- a/src/video_core/query_cache.h +++ b/src/video_core/query_cache.h @@ -11,10 +11,11 @@ #include #include #include -#include -#include #include +#include +#include + #include "common/assert.h" #include "core/core.h" #include "core/settings.h" @@ -222,11 +223,11 @@ private: const u64 page_end = addr_end >> PAGE_BITS; for (u64 page = addr_begin >> PAGE_BITS; page <= page_end; ++page) { - const auto& it = cached_queries.find(page); + auto it = cached_queries.find(page); if (it == std::end(cached_queries)) { continue; } - auto& contents = it->second; + auto& contents = it.value(); for (auto& query : contents) { if (!in_range(query)) { continue; @@ -250,11 +251,11 @@ private: /// Tries to a get a cached query. Returns nullptr on failure. CachedQuery* TryGet(VAddr addr) { const u64 page = static_cast(addr) >> PAGE_BITS; - const auto it = cached_queries.find(page); + auto it = cached_queries.find(page); if (it == std::end(cached_queries)) { return nullptr; } - auto& contents = it->second; + auto& contents = it.value(); const auto found = std::find_if(std::begin(contents), std::end(contents), [addr](auto& query) { return query.GetCpuAddr() == addr; }); return found != std::end(contents) ? &*found : nullptr; @@ -262,7 +263,7 @@ private: void AsyncFlushQuery(VAddr addr) { if (!uncommitted_flushes) { - uncommitted_flushes = std::make_shared>(); + uncommitted_flushes = std::make_shared>(); } uncommitted_flushes->insert(addr); } @@ -275,12 +276,12 @@ private: std::recursive_mutex mutex; - std::unordered_map> cached_queries; + tsl::robin_map> cached_queries; std::array streams; - std::shared_ptr> uncommitted_flushes{}; - std::list>> committed_flushes; + std::shared_ptr> uncommitted_flushes{}; + std::list>> committed_flushes; }; template diff --git a/src/video_core/renderer_opengl/gl_framebuffer_cache.cpp b/src/video_core/renderer_opengl/gl_framebuffer_cache.cpp index b8a512cb64..29779b76a7 100644 --- a/src/video_core/renderer_opengl/gl_framebuffer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_framebuffer_cache.cpp @@ -3,9 +3,10 @@ // Refer to the license.txt file included. #include -#include #include +#include + #include #include "common/common_types.h" @@ -22,8 +23,8 @@ FramebufferCacheOpenGL::FramebufferCacheOpenGL() = default; FramebufferCacheOpenGL::~FramebufferCacheOpenGL() = default; GLuint FramebufferCacheOpenGL::GetFramebuffer(const FramebufferCacheKey& key) { - const auto [entry, is_cache_miss] = cache.try_emplace(key); - auto& framebuffer{entry->second}; + auto [entry, is_cache_miss] = cache.try_emplace(key); + auto& framebuffer = entry.value(); if (is_cache_miss) { framebuffer = CreateFramebuffer(key); } diff --git a/src/video_core/renderer_opengl/gl_framebuffer_cache.h b/src/video_core/renderer_opengl/gl_framebuffer_cache.h index 8f698fee0a..5dbbb963bd 100644 --- a/src/video_core/renderer_opengl/gl_framebuffer_cache.h +++ b/src/video_core/renderer_opengl/gl_framebuffer_cache.h @@ -6,7 +6,8 @@ #include #include -#include + +#include #include @@ -62,7 +63,10 @@ public: private: OGLFramebuffer CreateFramebuffer(const FramebufferCacheKey& key); - std::unordered_map cache; + tsl::robin_map, + std::equal_to, + std::allocator>, true> + cache; }; } // namespace OpenGL diff --git a/src/video_core/renderer_opengl/gl_query_cache.cpp b/src/video_core/renderer_opengl/gl_query_cache.cpp index d7ba57acaf..43c4eecd4d 100644 --- a/src/video_core/renderer_opengl/gl_query_cache.cpp +++ b/src/video_core/renderer_opengl/gl_query_cache.cpp @@ -5,10 +5,11 @@ #include #include #include -#include #include #include +#include + #include #include "common/assert.h" diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp index c6a3bf3a13..44f21c9fc0 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp @@ -8,7 +8,8 @@ #include #include #include -#include + +#include #include "common/alignment.h" #include "common/assert.h" @@ -181,18 +182,13 @@ ProgramSharedPtr BuildShader(const Device& device, ShaderType shader_type, u64 u return program; } -std::unordered_set GetSupportedFormats() { +std::vector GetSupportedFormats() { GLint num_formats; glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &num_formats); std::vector formats(num_formats); glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, formats.data()); - - std::unordered_set supported_formats; - for (const GLint format : formats) { - supported_formats.insert(static_cast(format)); - } - return supported_formats; + return formats; } } // Anonymous namespace @@ -413,8 +409,10 @@ void ShaderCacheOpenGL::LoadDiskCache(const std::atomic_bool& stop_loading, ProgramSharedPtr ShaderCacheOpenGL::GeneratePrecompiledProgram( const ShaderDiskCacheEntry& entry, const ShaderDiskCachePrecompiled& precompiled_entry, - const std::unordered_set& supported_formats) { - if (supported_formats.find(precompiled_entry.binary_format) == supported_formats.end()) { + const std::vector& supported_formats) { + const auto found = std::find(supported_formats.begin(), supported_formats.end(), + precompiled_entry.binary_format); + if (found == supported_formats.end()) { LOG_INFO(Render_OpenGL, "Precompiled cache entry with unsupported format, removing"); return {}; } diff --git a/src/video_core/renderer_opengl/gl_shader_cache.h b/src/video_core/renderer_opengl/gl_shader_cache.h index 994aaeaf24..91a9d02093 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.h +++ b/src/video_core/renderer_opengl/gl_shader_cache.h @@ -10,10 +10,10 @@ #include #include #include -#include -#include #include +#include + #include #include "common/common_types.h" @@ -110,15 +110,15 @@ public: Shader* GetComputeKernel(GPUVAddr code_addr); private: - ProgramSharedPtr GeneratePrecompiledProgram( - const ShaderDiskCacheEntry& entry, const ShaderDiskCachePrecompiled& precompiled_entry, - const std::unordered_set& supported_formats); + ProgramSharedPtr GeneratePrecompiledProgram(const ShaderDiskCacheEntry& entry, + const ShaderDiskCachePrecompiled& precompiled_entry, + const std::vector& supported_formats); Core::System& system; Core::Frontend::EmuWindow& emu_window; const Device& device; ShaderDiskCacheOpenGL disk_cache; - std::unordered_map runtime_cache; + tsl::robin_map runtime_cache; std::unique_ptr null_shader; std::unique_ptr null_kernel; diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp index 2c49aeaacc..c80a3ff560 100644 --- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp +++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp @@ -2694,7 +2694,7 @@ private: return AppendSuffix(GetGenericAttributeIndex(attribute), INPUT_ATTRIBUTE_NAME); } - std::unordered_map varying_description; + tsl::robin_map varying_description; std::string GetGenericOutputAttribute(Attribute::Index attribute, std::size_t element) const { const u8 offset = static_cast(GetGenericAttributeIndex(attribute) * 4 + element); @@ -2788,7 +2788,7 @@ private: const std::string_view suffix; const Header header; const bool use_unified_uniforms; - std::unordered_map transform_feedback; + tsl::robin_map transform_feedback; ShaderWriter code; diff --git a/src/video_core/renderer_opengl/gl_shader_disk_cache.h b/src/video_core/renderer_opengl/gl_shader_disk_cache.h index a79cef0e9c..3735841234 100644 --- a/src/video_core/renderer_opengl/gl_shader_disk_cache.h +++ b/src/video_core/renderer_opengl/gl_shader_disk_cache.h @@ -8,11 +8,12 @@ #include #include #include -#include -#include #include #include +#include +#include + #include #include "common/assert.h" @@ -166,7 +167,7 @@ private: std::size_t precompiled_cache_virtual_file_offset = 0; // Stored transferable shaders - std::unordered_set stored_transferable; + tsl::robin_set stored_transferable; // The cache has been loaded at boot bool is_usable{}; diff --git a/src/video_core/renderer_opengl/gl_texture_cache.h b/src/video_core/renderer_opengl/gl_texture_cache.h index bfc4ddf5d1..c146f698d8 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.h +++ b/src/video_core/renderer_opengl/gl_texture_cache.h @@ -7,10 +7,11 @@ #include #include #include -#include #include #include +#include + #include #include "common/common_types.h" @@ -151,7 +152,7 @@ private: OGLFramebuffer src_framebuffer; OGLFramebuffer dst_framebuffer; - std::unordered_map copy_pbo_cache; + tsl::robin_map copy_pbo_cache; }; } // namespace OpenGL diff --git a/src/video_core/renderer_vulkan/vk_device.cpp b/src/video_core/renderer_vulkan/vk_device.cpp index 26379ee013..2b9dc49fef 100644 --- a/src/video_core/renderer_vulkan/vk_device.cpp +++ b/src/video_core/renderer_vulkan/vk_device.cpp @@ -7,7 +7,6 @@ #include #include #include -#include #include #include @@ -78,8 +77,8 @@ VkFormatFeatureFlags GetFormatFeatures(VkFormatProperties properties, FormatType } } -std::unordered_map GetFormatProperties( - vk::PhysicalDevice physical, const vk::InstanceDispatch& dld) { +tsl::robin_map GetFormatProperties(vk::PhysicalDevice physical, + const vk::InstanceDispatch& dld) { static constexpr std::array formats{ VK_FORMAT_A8B8G8R8_UNORM_PACK32, VK_FORMAT_A8B8G8R8_UINT_PACK32, @@ -153,7 +152,7 @@ std::unordered_map GetFormatProperties( VK_FORMAT_ASTC_6x5_SRGB_BLOCK, VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, }; - std::unordered_map format_properties; + tsl::robin_map format_properties; for (const auto format : formats) { format_properties.emplace(format, physical.GetFormatProperties(format)); } @@ -752,12 +751,9 @@ void VKDevice::CollectTelemetryParameters() { std::vector VKDevice::GetDeviceQueueCreateInfos() const { static constexpr float QUEUE_PRIORITY = 1.0f; - std::unordered_set unique_queue_families{graphics_family, present_family}; std::vector queue_cis; - queue_cis.reserve(unique_queue_families.size()); - - for (const u32 queue_family : unique_queue_families) { - auto& ci = queue_cis.emplace_back(VkDeviceQueueCreateInfo{ + const auto insert_queue = [&queue_cis](u32 queue_family) { + auto& ci = queue_cis.emplace_back({ .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, .pNext = nullptr, .flags = 0, @@ -765,6 +761,11 @@ std::vector VKDevice::GetDeviceQueueCreateInfos() const }); ci.queueCount = 1; ci.pQueuePriorities = &QUEUE_PRIORITY; + }; + + insert_queue(graphics_family); + if (present_family != graphics_family) { + insert_queue(present_family); } return queue_cis; diff --git a/src/video_core/renderer_vulkan/vk_device.h b/src/video_core/renderer_vulkan/vk_device.h index ae5c21baa1..9459154147 100644 --- a/src/video_core/renderer_vulkan/vk_device.h +++ b/src/video_core/renderer_vulkan/vk_device.h @@ -6,9 +6,10 @@ #include #include -#include #include +#include + #include "common/common_types.h" #include "video_core/renderer_vulkan/nsight_aftermath_tracker.h" #include "video_core/renderer_vulkan/wrapper.h" @@ -252,7 +253,7 @@ private: std::vector reported_extensions; ///< Reported Vulkan extensions. /// Format properties dictionary. - std::unordered_map format_properties; + tsl::robin_map format_properties; /// Nsight Aftermath GPU crash tracker NsightAftermathTracker nsight_aftermath_tracker; diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 3da8353249..6084fadddd 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -212,8 +212,8 @@ VKGraphicsPipeline& VKPipelineCache::GetGraphicsPipeline(const GraphicsPipelineC } last_graphics_key = key; - const auto [pair, is_cache_miss] = graphics_cache.try_emplace(key); - auto& entry = pair->second; + auto [pair, is_cache_miss] = graphics_cache.try_emplace(key); + auto& entry = pair.value(); if (is_cache_miss) { LOG_INFO(Render_Vulkan, "Compile 0x{:016X}", key.Hash()); const auto [program, bindings] = DecompileShaders(key); @@ -227,8 +227,8 @@ VKGraphicsPipeline& VKPipelineCache::GetGraphicsPipeline(const GraphicsPipelineC VKComputePipeline& VKPipelineCache::GetComputePipeline(const ComputePipelineCacheKey& key) { MICROPROFILE_SCOPE(Vulkan_PipelineCache); - const auto [pair, is_cache_miss] = compute_cache.try_emplace(key); - auto& entry = pair->second; + auto [pair, is_cache_miss] = compute_cache.try_emplace(key); + auto& entry = pair.value(); if (!is_cache_miss) { return *entry; } diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.h b/src/video_core/renderer_vulkan/vk_pipeline_cache.h index 0a3fe65fbe..18af795641 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.h +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.h @@ -8,12 +8,13 @@ #include #include #include -#include #include #include #include +#include + #include "common/common_types.h" #include "video_core/engines/const_buffer_engine_interface.h" #include "video_core/engines/maxwell_3d.h" @@ -178,9 +179,18 @@ private: GraphicsPipelineCacheKey last_graphics_key; VKGraphicsPipeline* last_graphics_pipeline = nullptr; - std::unordered_map> + tsl::robin_map< + GraphicsPipelineCacheKey, std::unique_ptr, + std::hash, std::equal_to, + std::allocator>>, + true> graphics_cache; - std::unordered_map> compute_cache; + tsl::robin_map< + ComputePipelineCacheKey, std::unique_ptr, + std::hash, std::equal_to, + std::allocator>>, + true> + compute_cache; }; void FillDescriptorUpdateTemplateEntries( diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 7625871c25..b87b9c9de1 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -838,8 +838,8 @@ std::tuple RasterizerVulkan::ConfigureFramebuffers( texture_cache.MarkDepthBufferInUse(); } - const auto [fbentry, is_cache_miss] = framebuffer_cache.try_emplace(key); - auto& framebuffer = fbentry->second; + auto [entry, is_cache_miss] = framebuffer_cache.try_emplace(key); + auto& framebuffer = entry.value(); if (is_cache_miss) { VkFramebufferCreateInfo framebuffer_ci; framebuffer_ci.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 923178b0bb..b7280a622e 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h @@ -307,7 +307,10 @@ private: u32 draw_counter = 0; // TODO(Rodrigo): Invalidate on image destruction - std::unordered_map framebuffer_cache; + tsl::robin_map, + std::equal_to, + std::allocator>, true> + framebuffer_cache; }; } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_renderpass_cache.cpp b/src/video_core/renderer_vulkan/vk_renderpass_cache.cpp index 3f71d005e2..53c9e65b51 100644 --- a/src/video_core/renderer_vulkan/vk_renderpass_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_renderpass_cache.cpp @@ -29,12 +29,12 @@ VKRenderPassCache::VKRenderPassCache(const VKDevice& device) : device{device} {} VKRenderPassCache::~VKRenderPassCache() = default; VkRenderPass VKRenderPassCache::GetRenderPass(const RenderPassParams& params) { - const auto [pair, is_cache_miss] = cache.try_emplace(params); - auto& entry = pair->second; + auto [entry, is_cache_miss] = cache.try_emplace(params); + auto& renderpass = entry.value(); if (is_cache_miss) { - entry = CreateRenderPass(params); + renderpass = CreateRenderPass(params); } - return *entry; + return *renderpass; } vk::RenderPass VKRenderPassCache::CreateRenderPass(const RenderPassParams& params) const { diff --git a/src/video_core/renderer_vulkan/vk_renderpass_cache.h b/src/video_core/renderer_vulkan/vk_renderpass_cache.h index 8b0fec7203..2082af3ce6 100644 --- a/src/video_core/renderer_vulkan/vk_renderpass_cache.h +++ b/src/video_core/renderer_vulkan/vk_renderpass_cache.h @@ -5,11 +5,12 @@ #pragma once #include -#include #include #include +#include + #include "video_core/engines/maxwell_3d.h" #include "video_core/renderer_vulkan/wrapper.h" #include "video_core/surface.h" @@ -64,7 +65,10 @@ private: vk::RenderPass CreateRenderPass(const RenderPassParams& params) const; const VKDevice& device; - std::unordered_map cache; + tsl::robin_map, + std::equal_to, + std::allocator>, true> + cache; }; } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_sampler_cache.cpp b/src/video_core/renderer_vulkan/vk_sampler_cache.cpp index 616eacc368..9df7e7b290 100644 --- a/src/video_core/renderer_vulkan/vk_sampler_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_sampler_cache.cpp @@ -2,7 +2,7 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#include +#include #include "video_core/renderer_vulkan/maxwell_to_vk.h" #include "video_core/renderer_vulkan/vk_sampler_cache.h" diff --git a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp index 97429cc59f..c353d49e52 100644 --- a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp +++ b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp @@ -7,11 +7,12 @@ #include #include #include -#include #include #include +#include + #include #include "common/alignment.h" @@ -2701,7 +2702,7 @@ private: const Tegra::Shader::Header header; const Registry& registry; const Specialization& specialization; - std::unordered_map transform_feedback; + tsl::robin_map transform_feedback; const Id t_void = Name(TypeVoid(), "void"); @@ -2793,7 +2794,7 @@ private: Id shared_memory{}; std::array internal_flags{}; std::map input_attributes; - std::unordered_map output_attributes; + tsl::robin_map output_attributes; std::map constant_buffers; std::map global_buffers; std::map uniform_texels; diff --git a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp index 45c1802211..d7d75622b1 100644 --- a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp +++ b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp @@ -3,10 +3,11 @@ // Refer to the license.txt file included. #include -#include #include #include +#include + #include "common/bit_util.h" #include "common/common_types.h" #include "video_core/renderer_vulkan/vk_device.h" diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index bd93dcf209..871eb7f1e2 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -372,8 +372,8 @@ VkImageView CachedSurfaceView::GetImageView(SwizzleSource x_source, SwizzleSourc } last_swizzle = new_swizzle; - const auto [entry, is_cache_miss] = view_cache.try_emplace(new_swizzle); - auto& image_view = entry->second; + auto [entry, is_cache_miss] = view_cache.try_emplace(new_swizzle); + auto& image_view = entry.value(); if (!is_cache_miss) { return last_image_view = *image_view; } diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h index 807e26c8a0..5a04bad90f 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.h +++ b/src/video_core/renderer_vulkan/vk_texture_cache.h @@ -5,7 +5,8 @@ #pragma once #include -#include + +#include #include "common/common_types.h" #include "video_core/renderer_vulkan/vk_image.h" @@ -196,7 +197,7 @@ private: u32 last_swizzle = 0; vk::ImageView render_target; - std::unordered_map view_cache; + tsl::robin_map view_cache; }; class VKTextureCache final : public TextureCacheBase { diff --git a/src/video_core/sampler_cache.h b/src/video_core/sampler_cache.h index cbe3ad0711..def54cdda1 100644 --- a/src/video_core/sampler_cache.h +++ b/src/video_core/sampler_cache.h @@ -5,7 +5,8 @@ #pragma once #include -#include + +#include #include "video_core/textures/texture.h" @@ -40,8 +41,8 @@ template class SamplerCache { public: SamplerType GetSampler(const Tegra::Texture::TSCEntry& tsc) { - const auto [entry, is_cache_miss] = cache.try_emplace(SamplerCacheKey{tsc}); - auto& sampler = entry->second; + auto [entry, is_cache_miss] = cache.try_emplace(SamplerCacheKey{tsc}); + auto& sampler = entry.value(); if (is_cache_miss) { sampler = CreateSampler(tsc); } @@ -54,7 +55,10 @@ protected: virtual SamplerType ToSamplerType(const SamplerStorageType& sampler) const = 0; private: - std::unordered_map cache; + tsl::robin_map, + std::equal_to, + std::allocator>, true> + cache; }; } // namespace VideoCommon \ No newline at end of file diff --git a/src/video_core/shader/control_flow.cpp b/src/video_core/shader/control_flow.cpp index 8d86020f6a..71f77dcdec 100644 --- a/src/video_core/shader/control_flow.cpp +++ b/src/video_core/shader/control_flow.cpp @@ -6,9 +6,10 @@ #include #include #include -#include #include +#include + #include "common/assert.h" #include "common/common_types.h" #include "video_core/shader/ast.h" @@ -75,11 +76,11 @@ struct CFGRebuildState { std::vector block_info; std::list inspect_queries; std::list queries; - std::unordered_map registered; + tsl::robin_map registered; std::set labels; std::map ssy_labels; std::map pbk_labels; - std::unordered_map stacks; + tsl::robin_map stacks; ASTManager* manager{}; }; diff --git a/src/video_core/shader/registry.h b/src/video_core/shader/registry.h index 2312067657..7b6e730b75 100644 --- a/src/video_core/shader/registry.h +++ b/src/video_core/shader/registry.h @@ -7,9 +7,10 @@ #include #include #include -#include #include +#include + #include "common/common_types.h" #include "common/hash.h" #include "video_core/engines/const_buffer_engine_interface.h" @@ -48,12 +49,11 @@ struct equal_to { namespace VideoCommon::Shader { -using KeyMap = std::unordered_map, u32, Common::PairHash>; -using BoundSamplerMap = std::unordered_map; -using SeparateSamplerMap = - std::unordered_map; +using KeyMap = tsl::robin_map, u32, Common::PairHash>; +using BoundSamplerMap = tsl::robin_map; +using SeparateSamplerMap = tsl::robin_map; using BindlessSamplerMap = - std::unordered_map, Tegra::Engines::SamplerDescriptor, Common::PairHash>; + tsl::robin_map, Tegra::Engines::SamplerDescriptor, Common::PairHash>; struct GraphicsInfo { using Maxwell = Tegra::Engines::Maxwell3D::Regs; diff --git a/src/video_core/shader/transform_feedback.cpp b/src/video_core/shader/transform_feedback.cpp index 22a933761f..7d82683b25 100644 --- a/src/video_core/shader/transform_feedback.cpp +++ b/src/video_core/shader/transform_feedback.cpp @@ -4,7 +4,8 @@ #include #include -#include + +#include #include "common/assert.h" #include "common/common_types.h" @@ -70,9 +71,8 @@ constexpr std::array VECTORS = { }; } // namespace -std::unordered_map BuildTransformFeedback(const GraphicsInfo& info) { - - std::unordered_map tfb; +tsl::robin_map BuildTransformFeedback(const GraphicsInfo& info) { + tsl::robin_map tfb; for (std::size_t buffer = 0; buffer < Maxwell::NumTransformFeedbackBuffers; ++buffer) { const auto& locations = info.tfb_varying_locs[buffer]; diff --git a/src/video_core/shader/transform_feedback.h b/src/video_core/shader/transform_feedback.h index 77d05f64c7..a790adf206 100644 --- a/src/video_core/shader/transform_feedback.h +++ b/src/video_core/shader/transform_feedback.h @@ -4,7 +4,7 @@ #pragma once -#include +#include #include "common/common_types.h" #include "video_core/shader/registry.h" @@ -18,6 +18,6 @@ struct VaryingTFB { std::size_t components; }; -std::unordered_map BuildTransformFeedback(const GraphicsInfo& info); +tsl::robin_map BuildTransformFeedback(const GraphicsInfo& info); } // namespace VideoCommon::Shader diff --git a/src/video_core/shader_cache.h b/src/video_core/shader_cache.h index 015a789d68..891e858624 100644 --- a/src/video_core/shader_cache.h +++ b/src/video_core/shader_cache.h @@ -115,7 +115,7 @@ private: if (it == invalidation_cache.end()) { continue; } - InvalidatePageEntries(it->second, addr, addr_end); + InvalidatePageEntries(it.value(), addr, addr_end); } } @@ -175,9 +175,9 @@ private: void RemoveEntryFromInvalidationCache(const Entry* entry) { const u64 page_end = (entry->addr_end + PAGE_SIZE - 1) >> PAGE_BITS; for (u64 page = entry->addr_start >> PAGE_BITS; page < page_end; ++page) { - const auto entries_it = invalidation_cache.find(page); + auto entries_it = invalidation_cache.find(page); ASSERT(entries_it != invalidation_cache.end()); - std::vector& entries = entries_it->second; + std::vector& entries = entries_it.value(); const auto entry_it = std::find(entries.begin(), entries.end(), entry); ASSERT(entry_it != entries.end()); @@ -231,8 +231,8 @@ private: mutable std::mutex lookup_mutex; std::mutex invalidation_mutex; - std::unordered_map> lookup_cache; - std::unordered_map> invalidation_cache; + tsl::robin_map> lookup_cache; + tsl::robin_map> invalidation_cache; std::vector> storage; std::vector marked_for_removal; }; diff --git a/src/video_core/texture_cache/surface_base.h b/src/video_core/texture_cache/surface_base.h index 173f2edba0..826bf388d6 100644 --- a/src/video_core/texture_cache/surface_base.h +++ b/src/video_core/texture_cache/surface_base.h @@ -6,9 +6,10 @@ #include #include -#include #include +#include + #include "common/common_types.h" #include "video_core/gpu.h" #include "video_core/morton.h" @@ -306,12 +307,12 @@ protected: virtual TView CreateView(const ViewParams& view_key) = 0; TView main_view; - std::unordered_map views; + tsl::robin_map views; private: TView GetView(const ViewParams& key) { - const auto [entry, is_cache_miss] = views.try_emplace(key); - auto& view{entry->second}; + auto [entry, is_cache_miss] = views.try_emplace(key); + auto& view = entry.value(); if (is_cache_miss) { view = CreateView(key); } diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index cdcddb225b..394bc3a455 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -11,13 +11,14 @@ #include #include #include -#include #include #include #include #include +#include + #include "common/assert.h" #include "common/common_types.h" #include "common/math_util.h" @@ -833,8 +834,8 @@ private: // Step 1 // Check Level 1 Cache for a fast structural match. If candidate surface // matches at certain level we are pretty much done. - if (const auto iter = l1_cache.find(cpu_addr); iter != l1_cache.end()) { - TSurface& current_surface = iter->second; + if (auto iter = l1_cache.find(cpu_addr); iter != l1_cache.end()) { + TSurface& current_surface = iter.value(); const auto topological_result = current_surface->MatchesTopology(params); if (topological_result != MatchTopologyResult::FullMatch) { VectorSurface overlaps{current_surface}; @@ -963,8 +964,8 @@ private: return result; } - if (const auto iter = l1_cache.find(*cpu_addr); iter != l1_cache.end()) { - TSurface& current_surface = iter->second; + if (auto iter = l1_cache.find(*cpu_addr); iter != l1_cache.end()) { + TSurface& current_surface = iter.value(); const auto topological_result = current_surface->MatchesTopology(params); if (topological_result != MatchTopologyResult::FullMatch) { Deduction result{}; @@ -1273,19 +1274,22 @@ private: // large in size. static constexpr u64 registry_page_bits{20}; static constexpr u64 registry_page_size{1 << registry_page_bits}; - std::unordered_map> registry; + tsl::robin_map> registry; static constexpr u32 DEPTH_RT = 8; static constexpr u32 NO_RT = 0xFFFFFFFF; // The L1 Cache is used for fast texture lookup before checking the overlaps // This avoids calculating size and other stuffs. - std::unordered_map l1_cache; + tsl::robin_map l1_cache; /// The surface reserve is a "backup" cache, this is where we put unique surfaces that have /// previously been used. This is to prevent surfaces from being constantly created and /// destroyed when used with different surface parameters. - std::unordered_map> surface_reserve; + tsl::robin_map, std::hash, + std::equal_to, + std::allocator>>, true> + surface_reserve; std::array render_targets; FramebufferTargetInfo depth_buffer; @@ -1294,7 +1298,7 @@ private: /// This cache stores null surfaces in order to be used as a placeholder /// for invalid texture calls. - std::unordered_map invalid_cache; + tsl::robin_map invalid_cache; std::vector invalid_memory; std::list marked_for_unregister;