diff options
| author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2020-02-13 14:28:22 -0300 |
|---|---|---|
| committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2020-02-14 17:38:27 -0300 |
| commit | 748a3cd69d9a12e3b05d53c94c32213f09e91b36 (patch) | |
| tree | 6503b51a9cf99bc980fc31e24823777c94fbe167 /src | |
| parent | aaf68dc10b14b924107d4b837ff258b3b219f991 (diff) | |
query_cache: Add a recursive mutex for concurrent usage
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/query_cache.h | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/src/video_core/query_cache.h b/src/video_core/query_cache.h index 069032121b..86f5aade1c 100644 --- a/src/video_core/query_cache.h +++ b/src/video_core/query_cache.h @@ -9,6 +9,7 @@ #include <cstring> #include <iterator> #include <memory> +#include <mutex> #include <optional> #include <unordered_map> #include <vector> @@ -98,10 +99,12 @@ public: VideoCore::QueryType::SamplesPassed}}} {} void InvalidateRegion(CacheAddr addr, std::size_t size) { + std::unique_lock lock{mutex}; FlushAndRemoveRegion(addr, size); } void FlushRegion(CacheAddr addr, std::size_t size) { + std::unique_lock lock{mutex}; FlushAndRemoveRegion(addr, size); } @@ -112,6 +115,7 @@ public: * @param timestamp Timestamp, when empty the flushed query is assumed to be short. */ void Query(GPUVAddr gpu_addr, VideoCore::QueryType type, std::optional<u64> timestamp) { + std::unique_lock lock{mutex}; auto& memory_manager = system.GPU().MemoryManager(); const auto host_ptr = memory_manager.GetPointer(gpu_addr); @@ -219,6 +223,8 @@ private: Core::System& system; VideoCore::RasterizerInterface& rasterizer; + std::recursive_mutex mutex; + std::unordered_map<u64, std::vector<CachedQuery>> cached_queries; std::array<CounterStream, VideoCore::NumQueryTypes> streams; |
