From e6a224530454987aa7e4dfabe2f4d9b768b99a44 Mon Sep 17 00:00:00 2001 From: ReinUsesLisp Date: Sat, 2 Feb 2019 21:14:36 -0300 Subject: gl_shader_disk_cache: Use unordered containers --- .../renderer_opengl/gl_shader_disk_cache.h | 82 ++++++++++++---------- 1 file changed, 45 insertions(+), 37 deletions(-) (limited to 'src/video_core/renderer_opengl/gl_shader_disk_cache.h') 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 061c4f204..6be0c0547 100644 --- a/src/video_core/renderer_opengl/gl_shader_disk_cache.h +++ b/src/video_core/renderer_opengl/gl_shader_disk_cache.h @@ -5,9 +5,10 @@ #pragma once #include -#include #include #include +#include +#include #include #include @@ -37,23 +38,54 @@ struct BaseBindings { u32 gmem{}; u32 sampler{}; - bool operator<(const BaseBindings& rhs) const { - return Tie() < rhs.Tie(); - } - bool operator==(const BaseBindings& rhs) const { - return Tie() == rhs.Tie(); + return std::tie(cbuf, gmem, sampler) == std::tie(rhs.cbuf, rhs.gmem, rhs.sampler); } bool operator!=(const BaseBindings& rhs) const { return !operator==(rhs); } +}; + +/// Describes how a shader is used +struct ShaderDiskCacheUsage { + u64 unique_identifier{}; + BaseBindings bindings; + GLenum primitive{}; + + bool operator==(const ShaderDiskCacheUsage& rhs) const { + return std::tie(unique_identifier, bindings, primitive) == + std::tie(rhs.unique_identifier, rhs.bindings, rhs.primitive); + } + + bool operator!=(const ShaderDiskCacheUsage& rhs) const { + return !operator==(rhs); + } +}; + +} // namespace OpenGL + +namespace std { + +template <> +struct hash { + std::size_t operator()(const OpenGL::BaseBindings& bindings) const { + return bindings.cbuf | bindings.gmem << 8 | bindings.sampler << 16; + } +}; - std::tuple Tie() const { - return std::tie(cbuf, gmem, sampler); +template <> +struct hash { + std::size_t operator()(const OpenGL::ShaderDiskCacheUsage& usage) const { + return static_cast(usage.unique_identifier) ^ + std::hash()(usage.bindings) ^ usage.primitive << 16; } }; +} // namespace std + +namespace OpenGL { + /// Describes a shader how it's used by the guest GPU class ShaderDiskCacheRaw { public: @@ -114,30 +146,6 @@ private: ProgramCode program_code_b; }; -/// Describes how a shader is used -struct ShaderDiskCacheUsage { - bool operator<(const ShaderDiskCacheUsage& rhs) const { - return Tie() < rhs.Tie(); - } - - bool operator==(const ShaderDiskCacheUsage& rhs) const { - return Tie() == rhs.Tie(); - } - - bool operator!=(const ShaderDiskCacheUsage& rhs) const { - return !operator==(rhs); - } - - u64 unique_identifier{}; - BaseBindings bindings; - GLenum primitive{}; - -private: - std::tuple Tie() const { - return std::tie(unique_identifier, bindings, primitive); - } -}; - /// Contains decompiled data from a shader struct ShaderDiskCacheDecompiled { std::string code; @@ -159,8 +167,8 @@ public: LoadTransferable(); /// Loads current game's precompiled cache. Invalidates on failure. - std::pair, - std::map> + std::pair, + std::unordered_map> LoadPrecompiled(); /// Removes the transferable (and precompiled) cache file. @@ -184,8 +192,8 @@ public: private: /// Loads the transferable cache. Returns empty on failure. - std::optional, - std::map>> + std::optional, + std::unordered_map>> LoadPrecompiledFile(FileUtil::IOFile& file); /// Loads a decompiled cache entry from the passed file. Returns empty on failure. @@ -229,7 +237,7 @@ private: // Copre system Core::System& system; // Stored transferable shaders - std::map> transferable; + std::map> transferable; // The cache has been loaded at boot bool tried_to_load{}; }; -- cgit v1.2.3