query_cache: Add a recursive mutex for concurrent usage
This commit is contained in:
		| @@ -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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user